如何在Pandas中按特定格式透视转换DataFrame?
解决Pandas DataFrame的透视转换需求
嘿,这个需求其实就是把行和列的角色互换,同时把原来的GROUP列拆出来作为新的行索引,用Pandas的内置方法就能快速实现,我给你具体的操作步骤和代码:
1. 先模拟原始数据(方便你测试复现)
import pandas as pd # 构造和你结构一致的原始DataFrame data = { "AGE": ["00-04", "05-17", "18-25"], "GROUP-A": [77, 117, 64], "GROUP-Q": [133, 106, 110] # 其他GROUP列(比如GROUP-B到GROUP-P)可以直接补充在这里 } df = pd.DataFrame(data)
2. 方法一:melt + pivot组合(更通用,适合复杂场景)
这是最稳妥的做法,无论你有多少个GROUP列都能自动适配:
# 第一步:把宽表转成窄表,保留AGE作为标识列 melted_df = df.melt( id_vars="AGE", # 固定保留的列 var_name="GROUP", # 原GROUP列名会被放到这个新列里 value_name="VALUE" # 原GROUP列的数值会被放到这个新列里 ) # 去掉GROUP列的前缀"GROUP-",只保留A/Q等分组标识 melted_df["GROUP"] = melted_df["GROUP"].str.replace("GROUP-", "") # 第二步:把窄表转回目标格式的宽表 result_df = melted_df.pivot( index="GROUP", # 把GROUP作为行 columns="AGE", # 把AGE作为列 values="VALUE" # 填充的数值 ).reset_index() # 去掉自动生成的列索引名称(避免输出时顶部有"AGE"字样) result_df.columns.name = None
3. 方法二:直接转置(更简洁,适合简单场景)
如果你的数据结构很规整,用transpose转置后微调即可:
# 先把AGE设为索引,然后转置,再重置索引 transposed_df = df.set_index("AGE").transpose().reset_index() # 重命名列:第一列改为GROUP,后续列用原AGE的取值 transposed_df.columns = ["GROUP"] + list(df["AGE"]) # 同样去掉GROUP列的前缀 transposed_df["GROUP"] = transposed_df["GROUP"].str.replace("GROUP-", "")
最终输出结果
两种方法都会得到你想要的结构:
GROUP 00-04 05-17 18-25 0 A 77 117 64 1 Q 133 106 110
内容的提问来源于stack exchange,提问作者Ismael Benacha
相关产品推荐
相关产品推荐

