是否存在df.melt()的反向函数?如何一步实现指定DataFrame宽表转换
更简洁的Pandas实现方案
你可以用以下几种更简洁的方式实现需求,避免多次分组和合并操作:
方法1:分组生成列标识后透视
通过groupby.cumcount()为每个分组内的行生成序号,再用pivot直接转换:
import pandas as pd df = pd.DataFrame(data={'elem': ['a', 'a', 'b', 'b'], 'node' : [1,2,3,4]}) # 生成分组内序号(从1开始) df['seq'] = df.groupby('elem').cumcount() + 1 # 透视并重命名列 result = df.pivot(index='elem', columns='seq', values='node') \ .rename(columns={1: 'node_x', 2: 'node_y'}) \ .reset_index()
方法2:分组聚合为列表后展开
利用groupby.agg()将每个分组的node值收集为列表,再直接转为DataFrame并重命名列:
result = df.groupby('elem')['node'] \ .agg(list) \ .apply(pd.Series) \ .rename(columns={0: 'node_x', 1: 'node_y'}) \ .reset_index()
方法3:设置多级索引后展开
通过设置包含分组序号的多级索引,再用unstack将行转列:
result = df.set_index(['elem', df.groupby('elem').cumcount()])['node'] \ .unstack() \ .rename(columns={0: 'node_x', 1: 'node_y'}) \ .reset_index()
以上方法都能一步完成转换,相比你原来的多次分组合并操作更高效简洁,且无需依赖idxmin/idxmax(避免当node值顺序变化时可能出现的结果偏差)。
内容的提问来源于stack exchange,提问作者rlepretre
相关产品推荐
相关产品推荐

