Выберите строки в панде DataFrame с не более одной пустой записи - PullRequest
0 голосов
/ 11 июня 2018

Если мне нужно выбрать из фрейма данных, где столбцы col1 и col2 должны следовать условию, что по крайней мере один из этих столбцов должен быть не нулевым .

Сейчас я пытаюсьвыполнить ниже, но это не работает

df=df.loc[(df['Cat1_L2'].isnull()) & (df['Cat2_L3'].isnull())==False]

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Один из способов - перебрать все строки, используя itertuples().Помните, что это вычислительно дорого.

1 - Создайте список, который проверяет ваше состояние для каждой строки, используя itertuples ()

condition_list = []
for row in df.itertuples():
    if (row.Cat1_L2 != None) or (row.Cat2_L3 != None):
       condition_list.append(1)
    else:
       condition_list.append(0)

2.Преобразовать список в серии панд

 condition_series = pd.Series(condition_list)

3.Добавить серию к оригиналу df

df['condition_column'] = condition_series.values

4.Фильтр df

df_new = df[df.condition_column == 1]
del df_new['condition_column']
0 голосов
/ 11 июня 2018

Настройка
(изменение данных U8-Forward)

df = pd.DataFrame({'Cat1_L2':[1,np.nan,3, np.nan], 'Cat3_L3': [np.nan,3,4, np.nan]})
df

   Cat1_L2  Cat3_L3
0      1.0      NaN
1      NaN      3.0
2      3.0      4.0
3      NaN      NaN

Индексирование с помощью isna + sum

Исправление кодаубедитесь, что число True дел (соответствующих NaN в столбцах) меньше 2.

df[df[['Cat1_L2', 'Cat3_L3']].isna().sum(axis=1) < 2]

   Cat1_L2  Cat3_L3
0      1.0      NaN
1      NaN      3.0
2      3.0      4.0

dropna с thresh

df.dropna(subset=['Cat1_L2', 'Cat3_L3'], thresh=1)

   Cat1_L2  Cat3_L3
0      1.0      NaN
1      NaN      3.0
2      3.0      4.0
...