我有一个pandas数据帧,它包含一个名为contains_and
的列中的字符串列表。现在,我想从数据帧中选择contains_and
中单词全部包含在给定字符串中的行,例如
example: str = "I'm really satisfied with the quality and the price of product X"
df: pd.DataFrame = pd.DataFrame({"columnA": [1,2], "contains_and": [["price","quality"],["delivery","speed"]]})
产生这样的数据帧:
columnA contains_and
0 1 [price, quality]
1 2 [delivery, speed]
现在,我只想选择第1行,因为example
包含contains_and
中列表中的所有单词。
我最初的本能是做以下事情:
df.loc[
all([word in example for word in df["contains_and"]])
]
然而,这样做会导致以下错误:
TypeError: 'in <string>' requires string as left operand, not list
我不太确定如何最好地做到这一点,但这似乎不应该太难。有人知道这样做的好方法吗?
单向:
df = df[df.contains_and.apply(lambda x: all((i in example) for i in x), 1)]
输出:
columnA contains_and
0 1 [price, quality]
另一种方法是explode
列出候选单词列表,并检查(每行(它们是否都在用str.split
:找到的example
的单词中
# a Series of words
ex = pd.Series(example.split())
# boolean array reduced with `all`
to_keep = df["contains_and"].explode().isin(ex).groupby(level=0).all()
# keep only "True" rows
new_df = df[to_keep]
获取
>>> new_df
columnA contains_and
0 1 [price, quality]
基于@Nk03答案,您也可以尝试:
df = df[df.contains_and.apply(lambda x: any([q for q in x if q in example]))]
在我看来,检查单词是否在示例中更直观,而不是像你第一次尝试显示的那样相反。