将字符串与包含字符串列表的 pandas 系列匹配

Match string with pandas series that contain a list of strings

我有一个这样的 pandas 数据框:

值为字符串类型。我想知道这些行中的每一行是否都包含字符串 '63'.

所以我首先通过 df['col_name'].str.split(',') 拆分 ',' 处的每个字符串,这给了我这个:

现在每一行都包含一个字符串列表。接下来我尝试通过 df['col_name'].str.split(',').str.contains('63') 来匹配字符串,但它给了我这个:

为什么? :( 我希望它对所有行都说 False,尤其是对于包含值 263.

的行

df = pd.DataFrame({'col_name': ['196', '107,63,229', '208,263']})

df['col_name'].str.split(',').apply(lambda numbers: '63' in numbers)

=>

0 False 1 True 2 False Name: col_name, dtype: bool

建立在你开始的基础上,你如何只使用 apply 并检查字符串 63 是否在你调用 split 的结果列表中?祝你好运!

这里是pandas docs申请。

您可以使用列表理解。

这是一个最小的例子。

import pandas as pd

df = pd.DataFrame({'A': [[196], [504], [63, 100], [35, 1], [63]]})

df2 = df[[63 in x for x in df['A']]]

#            A
# 2  [63, 100]
# 4       [63]

这是有效的,因为列表推导产生了一个布尔列表。当然,这可以分配给 df 中的一个系列:

df['Test'] = [63 in x for x in df['A']]

#            A   Test
# 0      [196]  False
# 1      [504]  False
# 2  [63, 100]   True
# 3    [35, 1]  False
# 4       [63]   True

我认为最简单的方法是拆分列,然后应用匿名函数来检查您的值是否存在。

df['col_name'].str.split(',').apply(lambda x: "63" in x)

回答您的方法为何不起作用的问题 - 拆分操作的结果是一个包含列表值的系列。 str 访问器显然用于字符串操作,因此未定义在拆分结果上使用 str(理想情况下会引发 TypeError)