如何在query()中正确引用多重索引列标题?

12 投票
1 回答
2098 浏览
提问于 2025-04-28 18:47

如果你有一个简单的(单层)列索引,你可以通过 .query() 来访问 pandas 数据框中的某一列,方法如下:

df1 = pd.DataFrame(np.random.rand(10,2),index=range(10),columns=['A','B'])
df1.query('A > 0.5')

我现在在尝试在一个有多层列索引的数据框中做到类似的事情:

df2 = pd.DataFrame(np.random.rand(10,2),index=range(10),columns=[['A','B'],['C','D']])
df2.query('(A,C) > 0.5') # fails
df2.query('"(A,C)" > 0.5') # fails
df2.query('("A","C") > 0.5') # fails

这能实现吗?谢谢...

(说到这个问题的原因:query() 似乎可以让我们在行有多层索引而列是单层索引的数据框中非常简洁地选择数据,比如:

df3 = pd.DataFrame(np.random.rand(6,2),index=[[0]*3+[1]*3,range(2,8)],columns=['A','B'])
df3.index.names=['one','two']
df3.query('one==0 & two<4 & A>0.5')

我想在一个行列都有多层索引的数据框中做类似的事情...)

暂无标签

1 个回答

7

在GitHub上有一个关于这个问题的未解决的问题,不过在这之前,有人建议可以用一种变通的方法,通过@符号来引用DataFrame中的列:

df2.query("@df2.A.C > 0.5")

不过这并不是一个完美的解决办法。如果你的表头名称或者层级中有空格,你需要先去掉这些空格或者重新命名。

撰写回答