正在检查Pandas数据帧中存储的列表中的单词字符串



我有一个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]))]

在我看来,检查单词是否在示例中更直观,而不是像你第一次尝试显示的那样相反。

相关内容

  • 没有找到相关文章

最新更新