Python中如何将单行多列的DataFrame数据转换为目标格式
Python 单行多列DataFrame转换实现方案
你需要实现的是宽格式单行数据转长格式多行数据,核心是将横向排布的多组属性键值对拆分为独立行,以下是可直接运行的实现代码:
1. 构造和示例一致的测试数据
首先复现你截图里的原始单行DataFrame结构:
import pandas as pd # 原始单行多列数据 raw_df = pd.DataFrame({ "主键id": [1001], "属性1名称": ["颜色"], "属性1值": ["黑色"], "属性2名称": ["尺寸"], "属性2值": ["XL"], "属性3名称": ["重量"], "属性3值": ["180g"] })
2. 具体实现方法
方法一:wide_to_long 快速转换(适配列名有规律的场景)
如果你的属性列名有统一的编号规则(比如属性X名称/属性X值),用pandas内置的宽转长函数效率最高:
# 统一列名格式,适配函数识别规则 raw_df.columns = ["主键id", "attr_name_1", "attr_val_1", "attr_name_2", "attr_val_2", "attr_name_3", "attr_val_3"] # 宽转长处理 long_df = pd.wide_to_long( raw_df, stubnames=["attr_name", "attr_val"], i="主键id", j="属性序号", sep="_" ).reset_index(drop=True) # 重命名列得到目标格式 long_df.columns = ["主键id", "属性名称", "属性值"]
运行后输出的long_df就是你需要的多行格式。
方法二:逐块拆分重组(适配列名无规律的场景)
如果列名没有统一规则,直接按属性组拆分后拼接更灵活,不需要提前调整列名:
# 提取所有行共用的基础字段 base_part = raw_df[["主键id"]].copy() result_list = [] # 逐组提取属性对,每一组转成一行 attr_pairs = [ ("属性1名称", "属性1值"), ("属性2名称", "属性2值"), ("属性3名称", "属性3值") ] for name_col, val_col in attr_pairs: temp = base_part.copy() temp["属性名称"] = raw_df[name_col].iloc[0] temp["属性值"] = raw_df[val_col].iloc[0] result_list.append(temp) # 拼接所有分组得到最终结果 final_df = pd.concat(result_list, ignore_index=True)
注意:如果你的原始数据有多行而不是单行,只需要把循环内
.iloc[0]的取值逻辑改为逐行遍历取值即可,核心拆分逻辑不变。
内容的提问来源于stack exchange,提问作者goog
相关产品推荐
相关产品推荐

