You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python导入CSV后如何实现宽表转长表 完成指定行列转换需求

Python CSV多重表头行转列实现方案

你的数据属于典型的双重列表头+大分类行标记的交叉表结构,核心问题是需要先把第一行存储的GWP/Inf分类信息和原表头的月份信息合并为多级列头,再做宽转长操作。你之前的代码没有提取这部分分类信息,也没有处理重复的月份列名,因此无法得到预期结果。

完整实现代码

import pandas as pd

# 假设你已经通过 pd.read_csv() 读入原始数据存为df
# 1. 提取第一行存储的分类信息,构造多级列头
category_list = df.iloc[0, 1:].to_list()
df.columns = pd.MultiIndex.from_tuples(
    list(zip(df.columns, [''] + category_list)),
    names=['Months', 'Category']
)

# 2. 处理行数据:设置产品名为索引,删除已经提取完分类信息的第0行
df = df.set_index(('BNS', '')).drop('Creditor', axis=0)
df.index.name = 'Product'

# 3. 宽表转长表,把多级列头转为行维度
df = df.stack([0, 1]).reset_index(name='Value')

# 4. 可选:如果只需要输出Creditor分类下的产品(和你给出的示例一致),执行下面的筛选
# 先标记每个产品所属的大分类
df['parent_cat'] = df['Product'].where(df['Value'].isna()).ffill()
df = df.dropna(subset=['Value']).query("parent_cat == 'Creditor'").drop('parent_cat', axis=1)

# 调整列顺序为你需要的结构
df = df[['Product', 'Months', 'Category', 'Value']]

输出说明

执行完成后df的结构和你给出的预期结构完全一致,Value列会保留原始的数值类型。如果需要保留Non Creditor分类下的Rent、Spouse等数据,删除第4步的筛选代码即可。


内容的提问来源于stack exchange,提问作者Jody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:45:08