Pandas выбор кадра данных на основе содержимого объекта списка в кадре данных - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть pandas фрейм данных, где один столбец содержит объекты списка, что дает мне dtype: object. Объекты списка имеют разную длину.

        features           other_features
0        ["foo", "bar"]                2
1        ["foo", "dog"]                1
2        ["dog"]                       4

Я хочу выбрать строки в моем фрейме данных, где список содержит элементы, которые находятся в другом списке external_list = ["dog", "cat"].

В этом случае я хотел бы, чтобы результат был строки, которые содержат собаку или кошку вместе с другими coulmns, которые были бы:

        features           other_features
1        ["foo", "dog"]                1
2        ["dog"]                       4

Я пробовал isin, но из того, что я понимаю, требует, чтобы тип столбца элемента, чтобы смотреть, чтобы не быть список из более чем одного объекта.

filter = df["features"].isin(["dog", "cat"])

Это приводит к тому, что каждый элемент имеет значение False, чего не должно быть, поскольку некоторые должны иметь значение True, и он не возвращает остальные столбцы .

Как я могу решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Использовать map при сравнении списка, преобразованного в наборы, проверенные isdisjoint, ~ для обратной маски:

#if string repr of list
#import ast
#df['features'] = df['features'].apply(ast.literal_eval)

external_list = ["dog", "cat"]
df = df[~df.features.map(set(external_list).isdisjoint)]
print (df)
     features  other_features
1  [foo, dog]               1
2       [dog]               4
0 голосов
/ 14 апреля 2020

Давайте сделаем «взрыв» на оси = 0, тогда мы можем сделать isin

m=pd.DataFrame(df.features.tolist(),index=df.index).isin(external_list).any(1)
df=df[~m]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...