【问题标题】:Filter in pandas using operators使用运算符过滤 pandas
【发布时间】:2017-06-07 10:29:13
【问题描述】:

我有三个变量

a='col1'
b='=='
c=2

我有 Pandas 数据框

df = pd.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]},dtype=object)

我想过滤col1=2,所以我写了

df.query("@a @b @c")

这是抛出错误

File "<unknown>", line 1
    __pd_eval_local_a __pd_eval_local_b __pd_eval_local_c
                                      ^
SyntaxError: invalid syntax

有人可以帮助我如何使用这三个变量来实现这一目标吗?

谢谢,

【问题讨论】:

  • 你可以这样做df.query(a + b + c)
  • 是的,知道了。但是当我将 c 转换为字符串变量时,它正在工作!过滤时这种转换是否会成为问题?请帮忙!
  • 我不使用query所以我不知道评估规则但是如果你只是想构造一个查询字符串,那么在这里连接所有字符串以创建一个字符串会更容易,即使您想使用的东西确实有效,我认为它会失败,因为@c 将进行查询'col1' == '2',它将过滤字符串'2' 而不是数字2
  • 对不起,我不明白,请用一个完整的例子编辑你的问题,还有你在这里真正想达到的目标是我们的建议没有达到的目标
  • @jezrael, a+b+str(c) 不适用于字符串。示例:c=='aaa'; a+b+str(c) == 'col1==aaa'。并且aaa 没有被引用,因此它将被视为列名...

标签: python pandas operator-keyword


【解决方案1】:
In [214]: df
Out[214]:
  col1 col2 col3
0    0   10  aaa
1    1   11  bbb
2    2   12  ccc

In [215]: a='col1'; b='=='; c=2   # <--- `c` is `int`

In [216]: df.query(a + b + '@c')
Out[216]:
  col1 col2 col3
2    2   12  ccc

In [217]: a='col3'; b='=='; c='aaa'   # <--- `c` is `str`

In [218]: df.query(a + b + '@c')
Out[218]:
  col1 col2 col3
0    0   10  aaa

它也适用于 datetime dtypes,因为 .query() 会处理 dtypes:

In [226]: df['col4'] = pd.date_range('2017-01-01', freq='99D', periods=len(df))

In [227]: df
Out[227]:
  col1 col2 col3       col4
0    0   10  aaa 2017-01-01
1    1   11  bbb 2017-04-10
2    2   12  ccc 2017-07-18

In [228]: a='col4'; b='=='; c='2017-01-01'

In [229]: df.query(a + b + '@c')
Out[229]:
  col1 col2 col3       col4
0    0   10  aaa 2017-01-01

【讨论】:

  • '@c' 这是什么? Python 运算符?
  • @ScottBoston,这就是我们如何访问.query().eval() 方法中的变量,否则不带引号的字符串将被视为列名
  • 感谢您的解释
【解决方案2】:

如果不是必需的,你可以不使用查询来做到这一点,使用 eval :

a='col1'
b='=='
c='2'

instruction ="df[\"" + a + "\"]" + b  + c
>>>> 'df["col1"]==2'
df[eval(instruction)]
>>>> 
    col1    col2
  2  2      12

【讨论】:

    猜你喜欢
    • 2012-08-05
    • 2020-06-02
    • 2020-09-17
    • 2017-07-15
    • 1970-01-01
    • 2018-07-03
    • 2013-10-31
    • 2018-04-12
    相关资源
    最近更新 更多