[英]How to replace a string in a list if it contains a substring in Pandas DataFrame column
[英]How to test which cell in a pandas dataframe string column contains a substring of a given reference string?
我正在处理一个像这样的熊猫数据框:
0 Item Category
1 Hammer A
2 Car A
3 Cardiologist B
4 Park A
5 Parkway A
6 CarparkCar A
我需要在Item
中找到所有包含特定字母序列的单元格,这些字母序列定义为参考词的子字符串。 我对参考词中不包含其他字母的单元格不感兴趣。
reference_word = Carpark
所需的输出:
0 Item Category Contains_substring_of_reference_word
1 Hammer A FALSE
2 Car A TRUE
3 Cardiologist B FALSE
4 Park A TRUE
5 Parkway A FALSE
6 CarparkCar A TRUE
如何检查pandas数据框列的哪个单元格包含给定单词/字符串的子字符串?
选项1
一种简单的方法是使用apply
+ set.issubset
v = df.Item.str.lower().apply(lambda x: set(x).issubset('carpark'))
v
0 False
1 True
2 False
3 True
4 False
5 True
Name: Item, dtype: bool
将结果分配回-
df['Contains_substring_of_reference_word'] = v
df
Item Category Contains_substring_of_reference_word
0 Hammer A False
1 Car A True
2 Cardiologist B False
3 Park A True
4 Parkway A False
5 CarparkCar A True
选项2
使用set.difference
操作的另一种解决方案-
(df.Item.str.lower().apply(set) - set('carpark')).str.len() == 0
0 False
1 True
2 False
3 True
4 False
5 True
Name: Item, dtype: bool
选项3
使用np.vectorize
添加另一个选项,这应该更快。
c = set('carpark')
def foo(x):
return c.issuperset(x.lower())
v = np.vectorize(foo)
v(df.Item)
array([False, True, False, True, False, True], dtype=bool)
时机
df = pd.concat([df] * 100000, ignore_index=True)
%timeit df.Item.str.lower().apply(lambda x: set(x).issubset('carpark'))
1 loop, best of 3: 927 ms per loop
%timeit (df.Item.str.lower().apply(set) - set('carpark')).str.len() == 0
1 loop, best of 3: 1.13 s per loop
%timeit v(df.Item)
1 loop, best of 3: 497 ms per loop
您可以创建具有理解力的集合,并使用<=
表示子集。
sets = np.array([set(x.lower()) for x in df.Item.values.tolist()])
df.assign(Bool=sets <= set('carpark'))
Item Category Bool
0
1 Hammer A False
2 Car A True
3 Cardiologist B False
4 Park A True
5 Parkway A False
6 CarparkCar A True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.