我们说我有一个像这样的数据框
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
实现相同目标。有可能吗?
答案 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字符串的变体)?将任何计算推入字符串以使其隐式评估而不是显式评估将会有很多缺点,但除了语法糖之外,我看不到许多好处。