Удаление строки dataFrame в Pandas, если комбинация значений столбцов равна кортежу в списке - PullRequest
0 голосов
/ 16 мая 2018

В настоящее время я делаю это, чтобы удалить строку с определенным столбцом 'some_column' значение, найденное в списке removal_list

df = df[~df['some_column'].isin(removal_list)]

Как это сделать, если я хочу сравнить комбинациюзначений в скажем список кортежей?(необязательно должен быть список кортежей, если есть лучший способ добиться этого)

, например:

removal_list = [(item1,store1),(item2,store1),(item2,store2)]

, если df['column_1'] и df['column_2'] изу конкретной строки есть значения item1 и store1 (или любой другой кортеж в removal_list), затем удалите эту строку

; возможно, существует более двух столбцов, которые необходимо оценить

РЕДАКТИРОВАТЬ лучший пример:

client  account_type    description
0   1   2   photographer
1   2   2   banker
2   3   3   banker
3   4   2   journalist
4   5   4   journalist

remove_list = [(2,journalist),(3,banker)]

проверка по столбцам account_type и description

Вывод:

client  account_type    description
0   1   2   photographer
1   2   2   banker
4   5   4   journalist

Ответы [ 5 ]

0 голосов
/ 16 мая 2018

Если бы индекс был установлен на ['account_type', 'description'], мы могли бы использовать метод drop.

df.set_index(['account_type', 'description']).drop(remove_list).reset_index()

   account_type   description  client
0             2  photographer       1
1             2        banker       2
2             4    journalist       5
0 голосов
/ 16 мая 2018

Вы можете использовать метод запроса с дополнительным столбцом для выбора.

removal_list = [(item1,store1),(item2,store1),(item2,store2)]

df['removal_column'] = df.apply(lambda x: (x.account_type, x.description), axis='columns')
df = df.query('removal_column not in @removal_list').drop('removal_column', axis='columns')
0 голосов
/ 16 мая 2018

Я предлагаю создать DataFrame и merge с внутренним объединением по умолчанию:

remove_list = [(2,'journalist'),(3,'banker')]

df1 = pd.DataFrame(remove_list, columns=['account_type','description'])
print (df1)
   account_type description
0             2  journalist
1             3      banker

df = df.merge(df1, how='outer', indicator=True).query('_merge != "both"').drop('_merge', 1)
print (df)
   client  account_type   description
0       1             2  photographer
1       2             2        banker
4       5             4    journalist
0 голосов
/ 16 мая 2018

Один из способов - создать серию из двух столбцов, а затем использовать логическое индексирование. Я также советую вам использовать set вместо list для поиска O (1).

remove_set = {(2,'journalist'),(3,'banker')}

condition = pd.Series(list(zip(df.account_type, df.description))).isin(remove_set)

res = df[~condition]

print(res)

   client  account_type   description
0       1             2  photographer
1       2             2        banker
4       5             4    journalist
0 голосов
/ 16 мая 2018

Скажем, у вас есть

removal_list = [(item1,store1),(item2,store1),(item2,store2)]

Тогда

df[['column_1', 'column_2']].apply(tuple, axis=1)

должен создать серию кортежей, и поэтому

df[['column_1', 'column_2']].apply(tuple, axis=1).isin(removal_list)

- это бинарное условие, в котором вы находитесьпосле.Удаление такое же, как и раньше.Это должно работать для любого количества столбцов.

Пример

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df[['a', 'b']].apply(tuple, axis=1).isin([(1, 3), (30, 40)])
0    (1, 3)
1    (2, 4)
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...