是否可以使用 DataFrame.query() 来判断列是否存在?

Posted

技术标签:

【中文标题】是否可以使用 DataFrame.query() 来判断列是否存在?【英文标题】:Is it possible to use DataFrame.query() to tell if a column exists? 【发布时间】:2021-03-31 12:46:24 【问题描述】:

我有一个非常特殊的用例,允许管道用户传入字符串表达式,这些表达式由管道通过DataFrame.query() 进行评估。显然有farbetterways来确定pandas中的列存在,但是使用.query()是我目前的约束。

理想情况下,我希望有一个接受单个列名的查询,并返回一个数据框,如果存在则包含 1 列,如果不存在则没有列。

输入数据帧:

df = pd.DataFrame("a": [1, 2, 3], "b": [4, 5, 6])
index a b
0 1 4
1 2 5
2 3 6

查找存在的列时所需的返回值:

looking_for = "a"
df.query("@looking_for in columns")
index a
0 1
1 2
2 3

查找列时所需的返回值不存在

looking_for = "c"
df.query("@looking_for in columns")
index
0
1
2

我尝试过的:

直接使用数据框时这很容易,这是一种方法。但是,在阅读了 pandas 查询文档并摆弄了一下之后,我还没有从 .query() 方法中找到一种方法。

df.loc[:, df.columns.isin(["c"])]
index
0
1
2

【问题讨论】:

查询用于索引切片。对于列,您应该使用filter 【参考方案1】:

query 仅适用于过滤操作。如果您只能通过构建字符串表达式来执行此操作,则可以使用df.evaldf.query 的近亲):

if df.eval("@looking_for in @df.columns.tolist()"):
    print (df.eval("@df[@looking_for]"))

您也可以直接使用*** pd.eval 函数 ( pd.eval("df[looking_for]"))。更多关于evalthis post我的内容。


如果没有if 检查,eval 可能会导致 KeyError,因此您也可以将代码包装在 try-except 中,这样会短一些。

try:
    print (df.eval("@df[@looking_for]"))
except KeyError:
    # column not present

【讨论】:

【参考方案2】:

正如评论,我不确定您为什么坚持使用query,这在这种情况下并不是最好的。有几种选择:

选项 1:`过滤器:

looking_for = 'c'
df.filter(regex = rf'^looking_for$')

选项 2reindex

df.reindex([looking_for], axis=1)

【讨论】:

这是对这个问题的最佳建议——“不要使用 query()”。然而,由于未命名的原因,OP 似乎知道更好的方法(它们甚至在问题中被链接)但拒绝使用它们。不确定他们的实际用例是什么,但我想这将是有用的上下文。

以上是关于是否可以使用 DataFrame.query() 来判断列是否存在?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 使用 DataFrame.query 根据字符串长度过滤字符串数据

pandas-query使用

是否可以使用ghostscript检查pdf是否受密码保护?

是否可以使用 setup api 来判断设备是否已启用

是否可以使用 JavaScript 确定 GeoJSON 点是否在 GeoJSON 多边形内?

是否可以检查是否使用modernizr 启用了cookie?