通过带有pandas查询的部分字符串选择行

时间:2017-07-05 18:01:19

标签: python pandas dataframe

我有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")]但我更喜欢使用 查询。

3 个答案:

答案 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