Фильтр Dataframe, если столбец находится в любой части списка - PullRequest
1 голос
/ 21 мая 2019

Я пытаюсь отфильтровать фрейм данных со строками со значениями столбцов в списке.Однако значение в столбце не будет точно соответствовать списку.Могу ли я использовать какой-то подстановочный знак или дополнительно содержать?

Например, основываясь на приведенном ниже списке и кадре данных, я хотел бы вернуть или отфильтровать только строку 0.

list = ["123 ABC", "456 DEF", "789 GHI"]

id    idlist
0      ABC    
1      XYZ

Что-то вроде

df_2 = df[df["idlist"].isin(list)]

не будет работать, потому что будет искать точное совпадение.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

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

lst = ["123 ABC", "456 DEF", "789 GHI"]
df['match'] = [any(x in l for l in lst) for x in df['idlist']]
df

   id idlist  match
0   0    ABC   True
1   1    XYZ  False

Чтобы просто отфильтровать, используйте

df[[any(x in l for l in lst) for x in df['idlist']]]

   id idlist
0   0    ABC

Понимания списков - мой готовый синтаксис для многих строковых операций. Я написал подробную справку об их преимуществах в Для петель с пандами - Когда мне все равно? .

Если вам нужно обработать NaN, используйте функцию с обработкой try-catch.

def search(x, lst):
    try:
        return any(x in l for l in lst)
    except TypeError:
        return False

df[[search(x, lst) for x in df['idlist']]]

   id idlist
0   0    ABC
0 голосов
/ 21 мая 2019

Вы можете использовать библиотеку операторов, чтобы проверить, частично ли указана строка:

import operator
operator.contains('ABC','123 ABC')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...