使用DataFrame.query()方法可以判断一列是否存在吗?

10 浏览
0 Comments

使用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
0
0 Comments

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()方法。这些方法提供了更好的性能和效果。

0
0 Comments

在使用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

0