我想找到在多级数据帧中更改特定列名称的方法。
有了这些数据:
data = {
('A', '1', 'I'): [1, 2, 3, 4, 5],
('B', '2', 'II'): [1, 2, 3, 4, 5],
('C', '3', 'I'): [1, 2, 3, 4, 5],
('D', '4', 'II'): [1, 2, 3, 4, 5],
('E', '5', 'III'): [1, 2, 3, 4, 5],
}
dataDF = pd.DataFrame(data)
此代码不起作用:
dataDF.rename(columns = {('A', '1', 'I'):('Z', '100', 'Z')}, inplace=True)
结果:
A B C D E
1 2 3 4 5
I II I II III
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
4 5 5 5 5 5
也不是:
dataDF.columns.values[0] = ('Z', '100', 'Z')
结果:
A B C D E
1 2 3 4 5
I II I II III
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
4 5 5 5 5 5
但结合以上代码工作!!!
dataDF.columns.values[0] = ('Z', '100', 'Z')
dataDF.rename(columns = {('A', '1', 'I'):('Z', '100', 'Z')}, inplace=True)
dataDF
结果:
Z B C D E
100 2 3 4 5
Z II I II III
0 1 1 1 1 1
1 2 2 2 2 2
2 3 3 3 3 3
3 4 4 4 4 4
4 5 5 5 5 5
这是熊猫的虫子吗?
这是我的理论
熊猫不希望
pd.Index
s是可变的。如果我们自己尝试更改索引的第一个元素,就可以看到这一点但是熊猫无法控制您执行
values
属性的操作。我们看到
dataDF.columns
看起来是一样的,但是dataDF.columns.values
清楚地反映了这种变化。不幸的是,df.columns.values
不是显示在数据帧上的内容。另一方面,这看起来确实应该奏效。事实上我并不觉得不对。
我认为这只在更改了值之后才起作用,原因是
rename
通过查看值来强制重构列。既然我们改变了价值观,它现在就起作用了。这是非常笨拙的,我不建议建立一个依赖于此的过程。我的建议
我遇到这个问题的时候,我自己正试图找到在多个级别的数据框架中重命名列名的解决方案。我尝试了“暗物质”提供的解决方案,因为它看起来非常简单:
但显示了一条错误消息:
它似乎起作用了,但不再起作用了。所以我用:
结果:
dataDF
你可以像
DF.columns.levels=[[u'Z', u'B', u'C', u'D', u'E'],[u'5', u'2', u'3', u'4', u'5'],[u'IIIIII', u'II', u'III']]
那样简单地改变它相关问题 更多 >
编程相关推荐