如何调整带有MultiIndex多层索引的Pandas DataFrame结构
问题原因
你之前代码仅保留首个索引对应数值的核心原因是:使用xs提取指定二级索引的数据时,默认保留原有一级索引作为行索引,后续concat操作默认按行索引对齐合并,若不同number对应的行索引没有完全匹配,就会出现数据缺失的问题。
修正方案
import pandas as pd from functools import reduce numbers = [100,50,20,10,5,2,1] df_list = [] for number in numbers: # 提取对应二级索引数据,同时将一级索引转为普通列作为合并关联键 temp_series = df['First_column_value_name'].xs(key=number, level='Second_multiindex_column_name') temp_df = temp_series.reset_index().rename(columns={'First_column_value_name': f'{number}_R'}) df_list.append(temp_df) # 外连接合并保证所有索引的数值都完整保留,将参数中的「你原来的一级索引列名」替换为你实际的一级索引列名称即可 df_positions_as_columns = reduce( lambda left, right: pd.merge(left, right, on='你原来的一级索引列名', how='outer'), df_list ) # 若需要将原来的一级索引恢复为行索引,执行下行代码 # df_positions_as_columns = df_positions_as_columns.set_index('你原来的一级索引列名')
关键修改点
- 提取每个
number对应的数据时新增reset_index()操作,将行索引转为普通列作为合并的公共关联键 - 替换原有
concat为外连接merge操作,不管索引是否在所有number中存在,都会保留对应数值,不会丢失数据 - 重命名时直接生成
{number}_R格式列名,不需要额外单独赋值列名列表
内容的提问来源于stack exchange,提问作者Jerzy
相关产品推荐
相关产品推荐

