使用DataFrame.query()方法可以判断一列是否存在吗?
使用DataFrame.query()方法可以判断一列是否存在吗?
我有一个非常特殊的用例,其中流水线用户被允许通过DataFrame.query()
传入字符串表达式,由流水线进行评估。显然,有更好的方法来确定pandas中的列是否存在,但是使用.query()
是我的当前限制。
理想情况下,我希望有一个查询,接受一个列名并返回一个数据框,如果存在则只有1列,如果不存在则没有列。
输入数据框:
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
索引 | a | b |
---|---|---|
0 | 1 | 4 |
1 | 2 | 5 |
2 | 3 | 6 |
在查找存在的列时所需的返回值:
looking_for = "a" df.query("@looking_for in columns")
索引 | a |
---|---|
0 | 1 |
1 | 2 |
2 | 3 |
在查找不存在的列时所需的返回值:
looking_for = "c" df.query("@looking_for in columns")
索引 |
---|
0 |
1 |
2 |
我的尝试:
直接使用数据框时很容易,下面是一种方法。但是,在阅读pandas查询文档并尝试之后,我还没有找到一种使用.query()
方法来实现这个目标的方法。
df.loc[:, df.columns.isin(["c"])]
索引 |
---|
0 |
1 |
2 |
DataFrame.query()方法是一种用来查询DataFrame中数据的方法。然而,有时候我们可能需要先判断某个列是否存在,再进行查询操作。那么,我们该如何判断一个列是否存在呢?
在上述的问题中,有人建议不要使用query()方法,因为query()方法在这种情况下不是最佳选择。相反,提供了两种更好的方法来判断列是否存在并进行查询操作。
Option 1: 使用filter()方法来判断:
looking_for = 'c' df.filter(regex = rf'^{looking_for}$')
Option 2: 使用reindex()方法来判断:
df.reindex([looking_for], axis=1)
这两种方法都比使用query()方法更好。然而,问题的提出者似乎对这些更好的方法有所了解(甚至在问题中提供了链接),但是选择不使用它们。对于问题的实际用例,我们并不清楚,但是这些上下文信息可能会有帮助。
总结而言,我们可以使用filter()方法或reindex()方法来判断一个列是否存在,并进行相应的查询操作,而不必使用query()方法。这些方法提供了更好的性能和效果。
在使用DataFrame的query()函数时,只能用于过滤操作。如果你只能使用构建字符串表达式来进行这个操作,你可以使用df.eval()来实现。具体代码如下:
if df.eval("_for in .columns.tolist()"): print (df.eval("[_for]"))
你也可以直接使用顶层的pd.eval()函数来实现(pd.eval("df[looking_for]"))。更多关于eval的信息可以在这篇文章中找到:链接。
没有if检查的话,eval可能会导致KeyError错误,所以你可以将代码放在try-except语句中,这样会更简洁一些。具体代码如下:
try: print (df.eval("[_for]")) except KeyError: # column not present