Как удалить строки в кадре данных на основе 2 переменных в любом столбце - PullRequest
2 голосов
/ 01 февраля 2020

У меня есть набор данных, состоящий из 3 столбцов (почтовый индекс, район и район), настроенный следующим образом:

    df = pd.DataFrame({'Postcode' : ['M1', 'M2', 'M3', 'M4', 'M5'], 
            'Borough' : ['Ottawa', 'Not assigned', 'Montreal', 'Toronto', 'Kent'],
               'Neighbourhood' : ['Ottawa', 'Toronto', 'Montreal', 'Barrhaven', 'Not assigned']})

, который выглядит следующим образом:

Dataframe

Значения в столбцах Район и Соседство могут быть либо «Не назначено», либо допустимым текстом - значение «Не назначено» может быть в обеих ячейках или в одной или прочее.

То, что я хочу сделать, - это удалить строки во всем наборе данных, для которых в каждом из столбцов указано «Не назначено».

Я очень новичок в Python ... Я думал, что попытаюсь создать дополнительный столбец на основе значения одной из ячеек, давая True или False, поэтому я попробовал это ...

    df['Outcome'] = ["True" if x =='Not assigned' else "False" for x in df['Borough']] 

... который успешно добавил дополнительный столбец

Dataframe2

Тогда я бы попробовал удалить эти ИСТИННЫЕ строки с помощью функции drop () и Повторите процесс в столбце Соседство. Но это кажется грязным способом сделать это, и я в итоге получу 20 строк кода, где я уверен, что это можно сделать гораздо эффективнее.

Может кто-нибудь посоветуете, пожалуйста, самый простой способ избавиться от этих строк?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Мы можем использовать DataFrame.ne + DataFrame.all с axis = 1 для производительности boolean indexing :

df_filtered = df[df[['Borough','Neighbourhood']].ne('Not assigned').all(axis=1)]
print(df_filtered)

Выход

  Postcode   Borough Neighbourhood
0       M1    Ottawa        Ottawa
2       M3  Montreal      Montreal
3       M4   Toronto     Barrhaven
1 голос
/ 01 февраля 2020

Вы можете сделать это, используя побитовый "или" |:

df_filtered = df[~((df['Borough'] == 'Not assigned') | 
                   (df['Neighbourhood'] == 'Not assigned'))]

Результат с вашим набором данных будет:

  Postcode   Borough Neighbourhood
0       M1    Ottawa        Ottawa
2       M3  Montreal      Montreal
3       M4   Toronto     Barrhaven
0 голосов
/ 01 февраля 2020

Попробуйте:

df = df[~(df['Borough'].eq('Not assigned') | df['Borough'].eq('Not assigned'))]
  Postcode   Borough Neighbourhood
0       M1    Ottawa        Ottawa
2       M3  Montreal      Montreal
3       M4   Toronto     Barrhaven
...