如何修正Pandas分组计数器的计数方向以获取正序结果?
修正Pandas分组计数器的计数方向问题
我需要修正Pandas分组计数器的计数方向,当前实现得到的是倒序结果,具体情况如下:
原DataFrame(adf)结构:
| Visit - ID | Pos(int) | Title(str) |
|---|---|---|
| randomnumber1 | 1 | rstring |
| randomnumber1 | 2 | rstring |
| randomnumber2 | 1 | rstring |
| randomnumber2 | 2 | rstring |
| randomnumber2 | 3 | rstring |
当前使用的代码:
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 - ID | Pos 1 | Pos 2 | Pos 3 |
|---|---|---|---|
| randomnumber1 | 2 | 1 | NaN |
| randomnumber2 | 3 | 2 | 1 |
| randomnumber3 | 3 | 2 | 1 |
| randomnumber4 | 3 | 2 | 1 |
| randomnumber5 | 3 | 2 | 1 |
目标输出:
| Visit - ID | Col 1 | Col 2 | Col 3 |
|---|---|---|---|
| randomnumber1 | 1 | 2 | NaN |
| randomnumber2 | 1 | 2 | 3 |
| randomnumber3 | 1 | 2 | 3 |
| randomnumber4 | 1 | 2 | 3 |
| randomnumber5 | 1 | 2 | 3 |
解决方案
问题根源在于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
相关产品推荐
相关产品推荐

