如何按分隔符拆分对应名称和值列,实现Pandas数据宽表转换
解决方案
核心思路是用pandas原生的拆分、长表转宽表的向量化操作替代逐行遍历,性能可提升数十至上百倍,适合处理大数据集。
第一步:修正测试数据集语法(原示例代码漏了逗号)
import pandas as pd df = pd.DataFrame( [ [1,'Height.Weight','20.50','First'], [2,'Weight.Height','65.30','Second'], [3,'Height.Width.Depth','22.30.10','Third'] ], columns = ['Object','All_Measures','All_Values','Object_Name'] )
第二步:核心处理代码
# 1. 拆分指标、数值列,每行展开为单个指标+对应值的长表结构 df_long = df.assign( measure = df['All_Measures'].str.split('.'), value = df['All_Values'].str.split('.') ).explode(['measure', 'value']) # 2. 将值转换为数值类型 df_long['value'] = pd.to_numeric(df_long['value']) # 3. 长表转宽表,缺失值填充为0 df_wide = df_long.pivot_table( index=df_long.index, columns='measure', values='value', fill_value=0 ) # 4. 合并回原表其他字段,删除不需要的原始列 result = pd.concat( [df.drop(columns=['All_Measures', 'All_Values']), df_wide], axis=1 )
输出结果验证
运行后得到的result结构完全符合预期:
| Object | Object_Name | Depth | Height | Weight | Width |
|---|---|---|---|---|---|
| 1 | First | 0 | 20 | 50 | 0 |
| 2 | Second | 0 | 30 | 65 | 0 |
| 3 | Third | 10 | 22 | 0 | 30 |
注:列顺序可按需调整,所有未在All_Measures中出现的指标自动填充为0,原表其他附加列会自动保留无需额外处理。
内容的提问来源于stack exchange,提问作者Jigsaw
相关产品推荐
相关产品推荐

