pandas 基于字符串条件选择具有“list”列的dataframe行

92vpleto  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(104)

我有一个具有以下结构的 Dataframe :

我只想从该 Dataframe 中选择包含给定配料列表的所有的行。例如,我只想选择包含“大蒜”、“豌豆”和“洋葱”的行。一个小问题是,我不想检查配料列表中是否存在与“洋葱”完全匹配的项,而是检查该列表中是否存在包含子字符串“洋葱”的配料。
我该怎么写一个优雅的oneliner呢?我在网上找到了这样的东西:

ing = ["onion","garlic","peas"]
mask = dataframe[column].apply(lambda x: any(item for item in ing if item in x))
rez = dataframe[mask]

但我相信这只适用于精确匹配(如果成分“onions”在列中,它不会注册为匹配),并且它返回包含任何成分的行。

cwtwac6a

cwtwac6a1#

试试这个是否有效:

import pandas as pd
ing = [
    ['bla', 'blabla', ['apple', 'garlic']],
    ['bla2', 'blabla2', ['pear', 'bread']],
    ['bla3', 'blabla3', ['pear', 'garlic', 'bread']],
]

df = pd.DataFrame(ing, columns=['name', 'sthng', 'ingr'])
l = ['pear', 'bread']

df.loc[df['ingr'] == pd.Series([l]*len(df['ingr'])), :]

使用df.loc你可以指定掩码和返回什么(:返回所有列)。比较有点复杂,因为Pandas会尝试逐项匹配,所以在我的例子中,3行2个元素,并且会失败。如果不使用series,它会尝试将一个迭代器(3个元素)与一个二维迭代器(即[['pear', 'bread'], ['pear', 'bread'], ['pear', 'bread']])匹配。放入series会正确地对齐它以进行比较。
编辑:我刚刚注意到jezreal的回答。我假设你只需要匹配那些与成分列表完全匹配的成分。如果你需要匹配至少列表中的元素,那么他的答案是正确的。

5anewei6

5anewei62#

你几乎就在那里了,但你必须使用嵌套语句:

mask = [all(any(ref in item for item in l) for ref in ing)
        for l in df['Ingredients']]

rez = df[mask]

输出示例:

Ingredients
1  [garlic-powder, onion, peas, flour]

使用的输入:

df = pd.DataFrame({'Ingredients': [['garlic', 'onion', 'rice'],
                                   ['garlic-powder', 'onion', 'peas', 'flour']]})

相关问题