Удаление строки в фрейме данных pandas, если значение является массивом вместо одного значения

#python #pandas #sklearn-pandas

#python #pandas #sklearn-pandas

Вопрос:

У меня есть фрейм данных, где в одном из столбцов есть несколько строк со значением массива вместо одного значения int64. Я хочу удалить все такие строки.

Для этого я использую следующий код, но это не работает (по понятным причинам, поскольку он сравнивается со строкой).

 handover_data.drop(handover_data[handover_data['S-PCI'] == '[105 106]'].index, inplace=True)
  

В фрейме данных оно должно иметь либо 105, либо 106, не оба, но некоторые из вариантов имеют [105 106]

Какие есть способы сравнить это, чтобы проверить, есть ли массив вместо ожидаемого значения:

Набор данных выглядит следующим образом:

 S-Cell ID  N-Cell ID S-PLMN  S-PCI  N-PCI        S-BW        N-BW  
73        257          0    105    105    106  2147483647  2147483647   

    S-EARFCN  N-EARFCN  
73      3025      3025  30102 

     Elapsed RT  Time (ms)  RSRP-105  RSRP-106  RSRQ-105  RSRQ-106  
73  41846000000  2947094.0       -84       -90        -4       -14

  

Редактировать:

 s_Cell = 105
for i, j in hd_data.iterrows():
        if(hd_data.at[i,'S-PCI'].all() != s_Cell):
        hd_data.at[i,'H_Event'] = 1
  

Это сбой со следующей ошибкой:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-399-d4c47a34a73e> in <module>
     19         print(i)
     20         print(handover_data.at[i,'S-PCI'])
---> 21     if(handover_data.at[i,'S-PCI'].all() != starting_Cell):
     22         handover_data.at[i,'Handover_Event'] = 1
     23         #handover_data.at[i,'Time_to_Handover'] = handover_data.at[i,'TimeInterval']-last_HO_time

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
  

Комментарии:

1. Проверить с помощью isin ?

2. можете ли вы опубликовать несколько строк вашего df?

3. используется isin() для фильтрации строк, которые находятся в списке / массиве

Ответ №1:

вы можете фильтровать по нужным значениям, например

 wanted_values = [105, 106]
handover_data = handover_data[handover_data['S-PCI'].isin(wanted_values)]
  

если вы хотите удалить элементы, которые конкретно являются списком, то это было бы немного более ресурсоемким

 import numpy as np
handover_data = handover_data.apply(lambda x: np.nan if isinstance(x['S-PCI'], list) else x).dropna(subset=['S-PCI'])
  

Ответ №2:

попробуйте это

 handover_data.drop(handover_data[handover_data['S-PCI'].apply(lambda x: not str(x).isdigit())].index, inplace=True)