如何在Pandas中将外层列索引转换为Source列并重塑数据?
解决方案
你的需求是将多层列索引的DataFrame转换为长格式,核心是把外层的source列索引转为单独的Source列,同时保留内层的指标列并按水果重复对应source的数据。以下是具体实现步骤:
步骤1:确认原DataFrame结构
假设你的DataFrame名为df,列是多层索引(MultiIndex):
- 外层索引名为
source,取值为1、10、20 - 内层索引为指标名:
Ripeness、Tastiness - 行索引为水果名称:
Apple、Banana、Pear
步骤2:使用pandas的stack()方法转换
stack()可以将指定层级的列索引转换为行索引,再通过reset_index()将行索引转为普通列,最后调整列顺序即可得到目标格式:
import pandas as pd # (可选)如果内层列索引没有名称,先设置列索引的名称 df.columns.names = ['source', 'metric'] # 转换核心代码 df_transformed = df.stack(level='source').reset_index() # 重命名列并调整顺序,匹配目标格式 df_transformed = df_transformed.rename(columns={'source': 'Source'}) df_transformed = df_transformed[['Ripeness', 'Tastiness', 'Source']]
模拟示例验证
如果你没有实际数据,可以用以下模拟代码测试:
# 构造模拟原DataFrame data = { (1, 'Ripeness'): [4, 6, 3], (1, 'Tastiness'): [10, 5, 5], (10, 'Ripeness'): [7, 8, 2], (10, 'Tastiness'): [8, 6, 4], (20, 'Ripeness'): [5, 9, 4], (20, 'Tastiness'): [9, 7, 6] } df = pd.DataFrame(data, index=['Apple', 'Banana', 'Pear']) df.columns.names = ['source', 'metric'] # 执行转换 df_transformed = df.stack(level='source').reset_index().rename(columns={'source': 'Source'}) df_transformed = df_transformed[['Ripeness', 'Tastiness', 'Source']] print(df_transformed)
输出结果会完全匹配你想要的格式:
Ripeness Tastiness Source Apple 4 10 1 Banana 6 5 1 Pear 3 5 1 Apple 7 8 10 Banana 8 6 10 Pear 2 4 10 Apple 5 9 20 Banana 9 7 20 Pear 4 6 20
内容的提问来源于stack exchange,提问作者msm
相关产品推荐
相关产品推荐

