Pandas数据框多行查询

16

假设我有一个数据框

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(10, size=(10,3)), columns=['a', 'b', 'c'])

如果我现在尝试使用 query 方法查询它:

这个是正常的:

df.query('''a > 3 and b < 9''')

这会抛出一个错误:

df.query(
    '''
        a > 3 and
        b < 9
    '''
)

我尝试了许多多行字符串的变化,但结果总是以下错误:

~/ven/lib/python3.6/site-packages/pandas/core/computation/eval.py in eval(expr, parser, engine, truediv, local_dict, global_dict, resolvers, level, target, inplace)
    306     if multi_line and target is None:
    307         raise ValueError(
--> 308             "multi-line expressions are only valid in the "
    309             "context of data, use DataFrame.eval"
    310         )

ValueError: multi-line expressions are only valid in the context of data, use DataFrame.eval

有人知道如何让它工作吗? 问题是,实际上我需要执行非常长的查询,而只写一行会非常不方便。 我知道我可以使用布尔索引,但我的问题只涉及如何使用query方法进行多行查询。

谢谢

2个回答

18

使用多行字符反斜杠( \

例如:

df = pd.DataFrame(np.random.randint(10, size=(10,3)), columns=['a', 'b', 'c'])
print(df.query(
    '''
        a > 3 and \
        b < 9
    '''
))

3
您可以删除换行符\n以允许多行查询。
query_multiline = '''
  a > 3 and
  b < 9
'''

query_multiline = query_multiline.replace('\n', '')

df.query(query_multiline)    

1
对于非平凡的多行查询,在我看来,这种解决方案更优越,比起其他答案(目前有更多赞)中显示的使用反斜杠转义换行符。原因有两个:1)编辑现有查询时转义所有可能存在的换行符很繁琐且容易出错;2)添加大量的 \ 可能会混淆您漂亮格式化的多行查询,可能会影响维护。节省自己的精力,保持查询的美观,并通过 query.replace('\n', '') 以编程方式实现! - Trutane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接