我发现了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)
然后每次使用我自己的班级而不是熊猫队。这是唯一的方法吗?
答案 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
是确保您引用索引的一种更正式的方法。有关使用in
和ilevel_0
的更多详细信息,请参见此处的文档:https://pandas.pydata.org/pandas-docs/stable/indexing.html#the-query-method