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

时间:2018-03-06 21:50:53

标签: python pandas split string-matching series

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

enter image description here

值是字符串类型。我想知道这些行中是否包含字符串<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <select id="1"> <option>Select 1</option> <select> <a href="javascript:;" id="change1">Change Select 1</a> <br /> <br /> <select id="2"> <option>Select 2</option> <select> <a href="javascript:;" id="change2">Change Select 2</a>

所以我首先通过'63'将每个字符串拆分为',',这给了我这个:

enter image description here

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

enter image description here

为什么呢? :(我希望所有行都说False,特别是对于包含值df['col_name'].str.split(',').str.contains('63')的行。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以使用列表理解。

这是一个最小的例子。

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

答案 2 :(得分:0)

我想说最简单的方法是拆分列然后应用匿名函数来检查你的值是否存在。

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

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