Pandas:将字段名与值列转换为独立列的高效方法求助
Pandas 长表转宽表优化方案
问题背景
现有DataFrame数据中,字段名称集中在Field_Names列,对应的值存于Field_Values列,示例数据如下:
import pandas as pd dummy_data = { 'Field_Names': ['Field_1','Field_2','Field_3','Field_1','Field_2','Field_3'], 'Field_Values': ['Bob','John','Kyle','Eric','Pat','Rana'] } dummy_df = pd.DataFrame(dummy_data)
当前通过逐个过滤字段名生成子DataFrame再拼接的方式实现转置,操作繁琐,需要更高效的Pandas原生方法。期望将数据转换为每个字段名作为列、对应值按行排列的格式,最终输出如下:
Field_1 Field_2 Field_3 0 Bob John Kyle 1 Eric Pat Rana
解决方案
方法1:pivot + cumcount(推荐)
该方法通过给每个字段分组内的行添加序号,再利用pivot完成转置,逻辑清晰且效率高:
# 为每个Field_Names分组内的行生成连续序号 dummy_df['row_idx'] = dummy_df.groupby('Field_Names').cumcount() # 执行转置:以序号为索引,字段名为列,值为对应内容 result = dummy_df.pivot(index='row_idx', columns='Field_Names', values='Field_Values') # 清理索引和列名标识 result = result.reset_index(drop=True) result.columns.name = None print(result)
方法2:groupby + apply(list)
如果仅需将每组值转为列表后构造DataFrame,可使用此方法:
# 按Field_Names分组,将每组的Field_Values转为列表 grouped_data = dummy_df.groupby('Field_Names')['Field_Values'].apply(list) # 将列表转为DataFrame并转置行和列 result = pd.DataFrame(grouped_data.tolist(), index=grouped_data.index).T print(result)
内容的提问来源于stack exchange,提问作者Carson Whitley
相关产品推荐
相关产品推荐

