是否可以在查询中使用切片?

时间:2017-11-21 12:37:19

标签: python pandas dataframe selection

我们说我有一个像这样的数据框

import pandas as pd

df = pd.DataFrame({'A': list(range(5)), 'B': ['X_abc', 'Y_abc', 'abc', 'foo', 'Y_abc']})

我希望在B列中查询某个值,我可以像这样使用query

target = 'Y_abc'

df_ss = df.query('B == @target')

产生

   A      B
1  1  Y_abc
4  4  Y_abc

正如所料。

我现在想知道是否有使用切片的选项,例如像这样的东西:

df_ss2 = df.query('B == @target[2:]')

这不起作用并返回

  

ValueError:" slice"不是支持的功能

我当然可以使用

df_ss3 = df.loc[df['B'] == target[2:]]

给出了预期的输出

   A    B
2  2  abc

但我想知道我是否可以使用query实现相同目标。有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试以下黑客攻击:

In [73]: df.query("B == @re.sub(r'^.{2}','', @target)")
Out[73]:
   A    B
2  2  abc

或者你可以写一个小辅助函数:

In [90]: def my_slice(s, start=0, stop=None, step=None):
    ...:     return s[start:stop:step]
    ...:

In [91]: my_slice(target, 2)
Out[91]: 'abc'

In [92]: df.query("B == @my_slice(@target,2)")
Out[92]:
   A    B
2  2  abc

答案 1 :(得分:2)

你可以这样做:

In [5]: s = slice(2, None)

In [6]: target[s]
Out[6]: 'abc'

In [7]: df.query('B == @target[@s]')
Out[7]: 
   A    B
2  2  abc

但实际上,为什么不呢

df_ss2 = df.query('B == "%s"' % target[2:])

(或使用格式说明符或f字符串的变体)?将任何计算推入字符串以使其隐式评估而不是显式评估将会有很多缺点,但除了语法糖之外,我看不到许多好处。