我有DataFrame
。 1列(name
)具有字符串值。我想知道是否有办法使用DataFrame.query()
方法根据与特定列的部分字符串匹配来选择行。
我试过了:
df.query('name.str.contains("lu")')
。错误消息:“TypeError:'Series'对象是可变的,因此无法进行哈希处理”df.query('"lu" in name')
。返回空DataFrame
。我使用的代码:
import pandas as pd
df = pd.DataFrame({
'name':['blue','red','blue'],
'X1':[96.32,96.01,96.05]
}, columns=['name','X1'])
print(df.query('"lu" in name').head())
print(df.query('name.str.contains("lu")').head())
我知道我可以使用df[df['name'].str.contains("lu")]
但我更喜欢使用
查询。
答案 0 :(得分:5)
@ayhan提到的问题现在说明了如何使用query
的python引擎来实现:
print(df.query('name.str.contains("lu")', engine='python').head())
应该工作。
答案 1 :(得分:3)
这个答案已经过时了。请检查@petobens' answer。
从版本0.20.2开始,query
不支持部分字符串匹配。关于它有一个open future request,其中一个核心开发人员似乎同意这将是一个很好的补充。
答案 2 :(得分:0)
petobens解决方案现在可以与Query
一起使用,而无需引擎规格,根据手册,这可以提高速度。
在 query 规范中使用contains
,这是处理字符串内容的强大功能,因为允许使用 regex 。
import numpy as np
import pandas as pd
A = np.array(["Paulo", "Lucas", "Luana", "Larra", "BaLu","Bela"])
B = np.array([111, 222, 222, 333, 333, 777])
C = np.random.randint(10, 99, 6)
dt = pd.DataFrame(zip(A, B, C), columns=['A', 'B', 'C'])
dt.set_index(['A', 'B'], inplace=True)
print(dt)
print("=============")
print(dt.query('A.str.contains("Lu")'))
print("=============")
print(dt.query('A.str.contains("L(a|u)", regex=True)'))
print("=============")
print(dt.query('A.str.contains("^L", regex=True)')) # starts with L
结果是
A B
1.1 Paulo 57
Lucas 49
3.3 Luana 38
Larra 82
5.5 BaLu 37
6.6 Bela 14
=============
C
A B
1.1 Lucas 49
3.3 Luana 38
5.5 BaLu 37
=============
C
A B
1.1 Lucas 49
3.3 Luana 38
Larra 82
5.5 BaLu 37
=============
C
A B
1.1 Lucas 49
3.3 Luana 38
Larra 82