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

时间:2017-10-19 03:31:05

标签: python pandas dataframe

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

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

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

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

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

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)

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

2 个答案:

答案 0 :(得分:2)

让事情变得简单,并使用一个函数:

def query_with_all(data_frame, query_string):
    if query_string == "all":
        return data_frame
    return data_frame.query(query_string)

每当需要使用这种类型的查询时,只需使用数据框和查询字符串调用该函数。无需使用任何额外的if语句或子类pd.Dataframe


如果您被限制使用df.query,则可以使用全局变量

ALL = slice(None)
df.query('@ALL', engine='python')

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

df.query('tuple()')

所有这些属性将处理NaN个值。

答案 1 :(得分:0)

df.query('ilevel_0 in ilevel_0')将始终返回完整的数据框,即使索引包含NaN值,甚至在数据框完全为空时也是如此。

在特定情况下,您可以定义一个全局变量all_true = 'ilevel_0 in ilevel_0'(如Zero的注释所建议),以便工程师可以在其配置文件中使用全局变量的名称。

此语句只是像您已经尝试过的那样正确查询True的肮脏方式。 ilevel_0是确保您引用索引的一种更正式的方法。有关使用inilevel_0的更多详细信息,请参见此处的文档:https://pandas.pydata.org/pandas-docs/stable/indexing.html#the-query-method