是否可以使用 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.eval
(df.query
的近亲):
if df.eval("@looking_for in @df.columns.tolist()"):
print (df.eval("@df[@looking_for]"))
您也可以直接使用*** pd.eval
函数 ( pd.eval("df[looking_for]")
)。更多关于eval
this 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$')
选项 2:reindex
:
df.reindex([looking_for], axis=1)
【讨论】:
这是对这个问题的最佳建议——“不要使用 query()”。然而,由于未命名的原因,OP 似乎知道更好的方法(它们甚至在问题中被链接)但拒绝使用它们。不确定他们的实际用例是什么,但我想这将是有用的上下文。以上是关于是否可以使用 DataFrame.query() 来判断列是否存在?的主要内容,如果未能解决你的问题,请参考以下文章
Pandas 使用 DataFrame.query 根据字符串长度过滤字符串数据
是否可以使用ghostscript检查pdf是否受密码保护?