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
相关产品推荐
相关产品推荐

