Pandas str.contains,包含所有给定的字符
Pandas str.contains, containing all the given characters
是否可以使用 str.contain 搜索包含所有给定字符的字符串?
这个有效:
df["col1"].str.contains("A")
如果我想找到至少一个给定的字符,这个也可以:
df["col1"].str.contains("A|B")
但是,如果我想查找包含所有给定字符的字符串,这是行不通的
df["col1"].str.contains("A&B")
结果全错。
有什么建议吗?
谢谢!
任一
df['col1'].str.contains('A.*B|B.*A')
或
df['col1'].str.contains('A') & df['col1'].str.contains('B')
示例:
>>> df
col1
0 wAxyzBw
1 wBxyzAw
2 wAxyz
3 wBxyz
>>> df['col1'].str.contains('A.*B|B.*A')
0 True
1 True
2 False
3 False
Name: col1, dtype: bool
>>> df['col1'].str.contains('A') & df['col1'].str.contains('B')
0 True
1 True
2 False
3 False
Name: col1, dtype: bool
如果您要查找大量(或最初未知的)字符集,一种稍微更通用的方法是
DataFrame({key: df.col1.str.contains(key) for key in 'AB'}).all(axis=1)
可能有更好的方法来做到这一点(通常在 pandas :),但它给了我与 @benzad.nouri 相当的性能在 5mm 排 DF 上回答。
另一种方法:
df['col1'].apply(set('AB').issubset)
以及一些时间示例:
import pandas as pd
import numpy as np
strings = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', 'CABA', 'dog', 'cat'])
%timeit strings.apply(set('AB').issubset)
# 10000 loops, best of 3: 102 µs per loop
%timeit strings.str.contains('A.*B|B.*A')
# 10000 loops, best of 3: 149 µs per loop
%timeit strings.str.contains('A') & strings.str.contains('B')
# 1000 loops, best of 3: 712 µs per loop
是否可以使用 str.contain 搜索包含所有给定字符的字符串?
这个有效:
df["col1"].str.contains("A")
如果我想找到至少一个给定的字符,这个也可以:
df["col1"].str.contains("A|B")
但是,如果我想查找包含所有给定字符的字符串,这是行不通的
df["col1"].str.contains("A&B")
结果全错。
有什么建议吗? 谢谢!
任一
df['col1'].str.contains('A.*B|B.*A')
或
df['col1'].str.contains('A') & df['col1'].str.contains('B')
示例:
>>> df
col1
0 wAxyzBw
1 wBxyzAw
2 wAxyz
3 wBxyz
>>> df['col1'].str.contains('A.*B|B.*A')
0 True
1 True
2 False
3 False
Name: col1, dtype: bool
>>> df['col1'].str.contains('A') & df['col1'].str.contains('B')
0 True
1 True
2 False
3 False
Name: col1, dtype: bool
如果您要查找大量(或最初未知的)字符集,一种稍微更通用的方法是
DataFrame({key: df.col1.str.contains(key) for key in 'AB'}).all(axis=1)
可能有更好的方法来做到这一点(通常在 pandas :),但它给了我与 @benzad.nouri 相当的性能在 5mm 排 DF 上回答。
另一种方法:
df['col1'].apply(set('AB').issubset)
以及一些时间示例:
import pandas as pd
import numpy as np
strings = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', 'CABA', 'dog', 'cat'])
%timeit strings.apply(set('AB').issubset)
# 10000 loops, best of 3: 102 µs per loop
%timeit strings.str.contains('A.*B|B.*A')
# 10000 loops, best of 3: 149 µs per loop
%timeit strings.str.contains('A') & strings.str.contains('B')
# 1000 loops, best of 3: 712 µs per loop