我有一个具有以下结构的 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”在列中,它不会注册为匹配),并且它返回包含任何成分的行。
2条答案
按热度按时间cwtwac6a1#
试试这个是否有效:
使用df.loc你可以指定掩码和返回什么(:返回所有列)。比较有点复杂,因为Pandas会尝试逐项匹配,所以在我的例子中,3行2个元素,并且会失败。如果不使用series,它会尝试将一个迭代器(3个元素)与一个二维迭代器(即
[['pear', 'bread'], ['pear', 'bread'], ['pear', 'bread']]
)匹配。放入series会正确地对齐它以进行比较。编辑:我刚刚注意到jezreal的回答。我假设你只需要匹配那些与成分列表完全匹配的成分。如果你需要匹配至少列表中的元素,那么他的答案是正确的。
5anewei62#
你几乎就在那里了,但你必须使用嵌套语句:
输出示例:
使用的输入: