Pandas DataFrame reshape操作:如何从单列生成多个列
pandas DataFrame宽表转指定长表结构实现方案
你需要做的是典型的宽格式转长格式reshape操作,根据你给出的原始/目标结构,可直接按以下方法实现:
方法1:wide_to_long(列名有规则时优先用,代码最简洁)
如果你的待转换列名有统一的命名规则(比如身高_男、体重_男、身高_女、体重_女这类「值字段_维度值」格式),直接用pandas内置的wide_to_long方法一步到位:
import pandas as pd # 参数按你实际表结构替换即可 result = pd.wide_to_long( df = 你的原始DataFrame, stubnames = ["身高", "体重"], # 填入要作为输出列的值字段前缀 i = ["班级", "年级"], # 填入所有不需要转置、固定保留的标识列 j = "性别", # 填入转置后存储原列名后缀的维度列名 sep = "_", # 列名前缀和后缀的分隔符,按你实际列名规则修改 suffix = ".+" ).reset_index()
方法2:melt+pivot组合(列名无统一规则时用,灵活性最高)
如果列名没有统一分隔/命名规则,用打平后再转置的通用方案:
# 1. 先把所有非标识列打平为长表 df_melt = 你的原始DataFrame.melt( id_vars = ["班级", "年级"], # 固定保留的标识列 var_name = "temp_col", value_name = "value" ) # 2. 拆分原列名为值字段名、维度值,拆分逻辑按你实际列名改 df_melt[["指标名", "维度值"]] = df_melt["temp_col"].apply(lambda x: 你自己的列名拆分逻辑).tolist() # 3. 把指标名转回单独列,得到最终结构 result = df_melt.pivot( index = ["班级", "年级", "维度值"], columns = "指标名", values = "value" ).reset_index() # 清理pivot产生的多余列名层级 result.columns.name = None
以上两种方法输出的结果完全匹配你给出的目标表结构,只需要把代码里的列名、拆分逻辑替换成你自己数据的实际规则即可。
内容的提问来源于stack exchange,提问作者Beertje
相关产品推荐
相关产品推荐

