pandas DataFrame.query表达式,默认返回所有行

moi*_*ink 6 python dataframe pandas

我发现了pandas DataFrame.query方法,它几乎完全符合我的需要(并实现了我自己的解析器,因为我没有意识到它存在,但实际上我应该使用标准方法).

我希望我的用户能够在配置文件中指定查询.语法看起来很直观,我可以期待我的非程序员(但工程师)用户能够弄明白.

缺少一件事:一种选择数据框中所有内容的方法.有时我的用户想要使用的是每一行,因此他们会将"全部"或其他内容放入该配置选项中.实际上,这将是默认选项.

我尝试了df.query('True'),但这引发了一个KeyError.我尝试了df.query('1')但返回了索引为1的行.空字符串引发了一个ValueError.

我能想到的唯一的事情是1)每次我需要做这种类型的查询(在代码中可能是3或4次)或2)子类DataFrame和重新实现查询,或添加query_with_all方法时放置一个if子句:

import pandas as pd

class MyDataFrame(pd.DataFrame):
    def query_with_all(self, query_string):
        if query_string.lower() == 'all':
            return self
        else:
            return self.query(query_string)
Run Code Online (Sandbox Code Playgroud)

然后每次使用我自己的班级而不是熊猫队.这是唯一的方法吗?

Jos*_*hua 6

保持简单,并使用一个函数:

def query_with_all(data_frame, query_string):
    if query_string == "all":
        return data_frame
    return data_frame.query(query_string)
Run Code Online (Sandbox Code Playgroud)

每当您需要使用此类查询时,只需使用数据框和查询字符串调用该函数即可。无需使用任何额外的ifstatements 或 subclass pd.Dataframe


如果您只能使用df.query,则可以使用全局变量

ALL = slice(None)
df.query('@ALL', engine='python')
Run Code Online (Sandbox Code Playgroud)

如果不允许使用全局变量,并且您的 DataFrame 不是 MultiIndexed,则可以使用

df.query('tuple()')
Run Code Online (Sandbox Code Playgroud)

所有这些都将是属性句柄NaN值。

  • 嗯,我都试过,都抛出错误。你在`query`中使用了任何选项吗?第一个给出“ValueError: unknown type object”,第二个给出“TypeError: unsupported expression type: <class 'tuple'>”。任何的想法? (3认同)