如何在pandas中查询数字列名?

时间:2018-01-04 06:25:20

标签: python pandas pandas-query

假设我创建了一个包含列和查询的数据框,即

pd.DataFrame([[1,2],[3,4],[5,6]],columns=['a','b']).query('a>1')

这会给我

   a  b
1  3  4
2  5  6

但是当数据帧值太大而我没有列名时,如何通过索引查询列?

我尝试通过传递一个数字来查询,但这不是这样做的方式。

pd.DataFrame([[1,2],[3,4],[5,6]]).query('0>1') # This is what I tried. 

如何表示0是查询中的列名?

预期产出:

   0  1
1  3  4
2  5  6

2 个答案:

答案 0 :(得分:3)

由于查询正在开发中,一种可能的解决方案是为pd.DataFrame创建一个猴子补丁以评估自己:

def query_cols(self,expr):
    if 'self' in expr:
        return self[eval(expr)]
    else:
        return self.query(expr)

pd.DataFrame.query_cols = query_cols

pd.DataFrame([[1,2],[3,4],[5,6]]).query_cols('self[1] > 3')

   0  1
1  3  4
2  5  6

pd.DataFrame([[1,2],[3,4],[5,6]]).query_cols('self[1] == 4')

   0  1
1  3  4

pd.DataFrame([[1,2],[3,4],[5,6]],columns=['a','b']).query_cols('a > 3')

   a  b
2  5  6

这是一个简单的技巧,并不适合所有情况,当解决查询问题时,答案将会更新。

答案 1 :(得分:0)

解决方案

没有任何猴子补丁的一个选项是使用 @ 来定义一个变量,并按如下方式执行此操作。

# If you are fond of one-liners
df = pd.DataFrame([[1,2],[3,4],[5,6]]); df.query('@df[0] > 1')

# Otherwise this is the same as
df = pd.DataFrame([[1,2],[3,4],[5,6]])
df.query('@df[0] > 1') # @df refers to the variable df

输出:

   0  1
1  3  4
2  5  6

参考文献

您可以找到更多处理此 here 的方法。