pandas多层索引DataFrame执行unstack时如何保留指定列不变
解法
报错原因
你之前的写法报错是因为*meter和Sleeper是原始df列MultiIndex的层级名称,不是普通列名*,直接调用set_index自然找不到对应字段抛出KeyError。
实现思路
把不需要展开的data3列单独拆分出来保留,仅对data1、data2执行unstack操作,最后按行索引匹配合并两部分数据即可。
完整代码
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame( np.arange(2, 11).reshape(-1, 3), index=list('ABC'), columns=pd.MultiIndex.from_arrays([ ['data1', 'data2','data3'], ['F', 'K',''], ['', '',''] ], names=['meter', 'Sleeper','']) ).rename_axis('Index') # 拆分需要展开的部分和保留的data3列 df_data3 = df['data3'].reset_index().rename(columns={('',''):'data3'}) df_to_unstack = df.drop('data3', axis=1, level=0) # 执行unstack操作 df_unstacked = df_to_unstack.unstack().reset_index().rename(columns={0:'value'}) # 合并得到最终结果 result = df_unstacked.merge(df_data3, on='Index')
最终结果示例
| meter | Sleeper | Index | value | data3 |
|---|---|---|---|---|
| data1 | F | A | 2 | 4 |
| data1 | F | B | 5 | 7 |
| data1 | F | C | 8 | 10 |
| data2 | K | A | 3 | 4 |
| data2 | K | B | 6 | 7 |
| data2 | K | C | 9 | 10 |
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

