我有一个pandas数据框,我希望通过列中的特定单词(test)进行过滤。我试过了:
df[df[col].str.contains('test')]
但它返回一个只有列名的空数据帧。对于输出,我正在寻找一个包含所有包含单词' test'的行的数据框。我能做什么?
编辑(添加样本):
data = pd.read_csv(/...csv)
数据有5个cols,包括'BusinessDescription'
,我想提取所有包含' dental' Business Description
col中的(不区分大小写),所以我使用了:
filtered = data[data['BusinessDescription'].str.contains('dental')==True]
我得到一个空的数据帧,只有5个列的标题名称。
答案 0 :(得分:6)
您似乎需要contains
中的参数flags
:
import re
filtered = data[data['BusinessDescription'].str.contains('dental', flags = re.IGNORECASE)]
另一个解决方案,感谢 Anton vBR首先转换为小写:
filtered = data[data['BusinessDescription'].str.lower().str.contains('dental')]
示例:强>
对于将来的编程,我建议在引用数据帧时使用关键字df而不是数据。这是使用该表示法的常见方法。
import pandas as pd
data = dict(BusinessDescription=['dental fluss','DENTAL','Dentist'])
df = pd.DataFrame(data)
df[df['BusinessDescription'].str.lower().str.contains('dental')]
BusinessDescription
0 dental fluss
1 DENTAL
<强>计时强>:
d = dict(BusinessDescription=['dental fluss','DENTAL','Dentist'])
data = pd.DataFrame(d)
data = pd.concat([data]*10000).reset_index(drop=True)
#print (data)
In [122]: %timeit data[data['BusinessDescription'].str.contains('dental', flags = re.IGNORECASE)]
10 loops, best of 3: 28.9 ms per loop
In [123]: %timeit data[data['BusinessDescription'].str.lower().str.contains('dental')]
10 loops, best of 3: 32.6 ms per loop
<强>买者强>:
性能实际上取决于数据 - DataFrame
的大小和匹配条件的值的数量。
答案 1 :(得分:1)
将字符串括在引号中。
df[df['col'].str.contains('test')]
由于
答案 2 :(得分:-1)
如果添加条件
,它也可以df[df['col'].str.contains('test') == True]