首发于微信公众号东哥夜谈。欢迎关注东哥夜谈,让我们一起聊聊个人成长、投资、编程、电影、运动等话题。
本帐号所有文章均为原创。文章可以随意转载,但请务必注明作者。如果觉得文章有用,欢迎转发朋友圈分享。
1. 缘起
多级索引(Hierarchical Index)的表格在我看来并不是一个好的表格。虽然给人的体验很好,但对机体验很不好,所以应该尽量避免。但处理外部数据的时候却总会遇到,比如描述统计量的杀手级武器 describe()
,其返回结果就是一个多级索引的 DataFrame。所以还是得研究一下。
2. 多级索引表格操作
多级索引表格的 index 是一个 MultiIndex
对象。MultiIndex的对象可以看成是一组由不同级级构成的一组 Tuple,可以用常见的方法索引之。很多函数中也会有level
选项,对应的就是这里的级级。比如df.sum(level='LC',axis=1)
。
有时候需要对一个多级索引表格进行过滤,原先那种简单过滤只适应于单层索引。对于多级索引,需要用到xs
方法。
DataFrame.xs(key, axis=0, level=None, drop_level=True)
Returns a cross-section (row(s) or column(s)) from the Series/DataFrame. Defaults to cross-section on the rows (axis=0).
比如要索引所有节点的均值,就可以用dmean = df.xs('mean', axis=0, level=1)
这种方法。
3. 扁平化多级索引
还是不是很喜欢多级索引……所以不妨将其改变之,比如变成单级索引。就比如对 STAAD Pro计算结果进行 describe 之后的结果
Absmm Xmm Ymm Zmm
Node item
269.0 count 2.600000e+01 26.000000 26.000000 26.000000
mean -5.150000e-02 0.005423 0.027385 -0.057077
std 9.984077e-02 0.012113 0.076432 0.090868
min -2.820000e-01 -0.014000 -0.012000 -0.265000
25% -7.250000e-02 -0.000750 -0.001750 -0.072250
50% -8.000000e-03 0.005000 0.000000 -0.013500
75% 6.750000e-03 0.009750 0.012500 0.002500
max 6.600000e-02 0.048000 0.288000 0.052000
其实这个多级索引,只要把前面的第 0 级的 Node 补全了,就变成一个单级索引的常规表格了。最简单的办法,便是把索引变成普通的列了。于是有代码rsdiff = sdiff.reset_index()
。一个reset_index
,便可以把原来的索引变成普通列。这是在对rsdiff
进行筛选之类就简单多了。比如可以用rmean = rsdiff[rsdiff.item == 'mean']
这样的 filter 进行筛选。
个人还是更喜欢这种方式……
4. 来源
- pandas.DataFrame.xs — pandas 0.20.3 documentation
- pandas.DataFrame.reset_index — pandas 0.20.3 documentation
![](../assets/DongTalks.jpg)