如何测试pandas数据帧字符串列中的哪个单元格包含给定引用字符串的子字符串?

2024-07-02 09:14:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个如下所示的pandas数据帧:

0 Item         Category
1 Hammer       A
2 Car          A
3 Cardiologist B
4 Park         A
5 Parkway      A
6 CarparkCar   A

我需要找到Item中包含特定字母序列的所有单元格,这些字母序列被定义为参考词的子字符串。我对包含参考词中没有的附加字母的单元格不感兴趣。在

^{pr2}$

期望输出:

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 dataframe列的哪个单元格包含给定单词/字符串的子字符串?


Tags: 数据字符串falsetrueparkpandas字母序列
2条回答

选项1
{{cd2>简单的方法是使用^-

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

将结果分配回-

^{pr2}$

选项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

相关问题 更多 >