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

如何修正Pandas分组计数器的计数方向以获取正序结果?

修正Pandas分组计数器的计数方向问题

我需要修正Pandas分组计数器的计数方向,当前实现得到的是倒序结果,具体情况如下:

原DataFrame(adf)结构:

Visit - IDPos(int)Title(str)
randomnumber11rstring
randomnumber12rstring
randomnumber21rstring
randomnumber22rstring
randomnumber23rstring

当前使用的代码:

bdf = (adf.assign(col=adf.groupby('Visit - ID').cumcount()+1)
   .set_index(['Visit - ID','col'])
   .unstack('col')
   .sort_index(level=(1,0), axis=1)
)

bdf.columns = [f'{x}{y}' for x,y in bdf.columns]

运行后错误输出:

Visit - IDPos 1Pos 2Pos 3
randomnumber121NaN
randomnumber2321
randomnumber3321
randomnumber4321
randomnumber5321

目标输出:

Visit - IDCol 1Col 2Col 3
randomnumber112NaN
randomnumber2123
randomnumber3123
randomnumber4123
randomnumber5123

解决方案

问题根源在于sort_index(level=(1,0), axis=1)的排序层级顺序错误,导致列被反向排列。cumcount()本身是按行顺序正序计数的,只需调整列排序逻辑即可。

方案1:修正列排序层级

将排序层级从(1,0)改为(0,1),先按原始列名(如Pos)排序,再按计数col排序:

bdf = (adf.assign(col=adf.groupby('Visit - ID').cumcount()+1)
   .set_index(['Visit - ID','col'])
   .unstack('col')
   .sort_index(level=(0,1), axis=1)  # 修正排序层级顺序
)

bdf.columns = [f'Col{y}' for x,y in bdf.columns]  # 匹配目标输出的列名格式

方案2:移除多余的列排序步骤

unstack('col')执行后,列已经按col的正序排列,无需额外排序,直接重命名列即可:

bdf = (adf.assign(col=adf.groupby('Visit - ID').cumcount()+1)
   .set_index(['Visit - ID','col'])
   .unstack('col')
)

bdf.columns = [f'Col{y}' for x,y in bdf.columns]

额外优化(可选)

如果原始数据中Pos列的顺序与行顺序不一致,建议先按Visit - ID和Pos排序,确保计数与Pos的逻辑顺序一致:

bdf = (adf.sort_values(['Visit - ID', 'Pos'])  # 先按分组键和Pos排序
   .assign(col=lambda df: df.groupby('Visit - ID').cumcount()+1)
   .set_index(['Visit - ID','col'])
   .unstack('col')
)

bdf.columns = [f'Col{y}' for x,y in bdf.columns]

内容的提问来源于stack exchange,提问作者Lazarus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:15:53