You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:22:15