将字符串与包含字符串列表的 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)
我有一个这样的 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)