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

如何按组内元素数量将pandas长格式DataFrame转换为宽格式

pandas长表转指定规则宽表实现方案

直接用交叉表配合简单映射即可实现需求,完整可运行代码如下:

import pandas as pd
import numpy as np

# 示例输入数据
X = pd.DataFrame({
    'alt.var': [1,2,3,4,1,2,1,2,1,1,2,3,1],
    'group': [1,1,1,1,2,2,3,3,4,5,5,5,6]
})

# 生成分组与alt.var的存在性交叉表
res = pd.crosstab(index=X['group'], columns=X['alt.var'])
# 不存在对应值的位置替换为空值
res = res.replace(0, np.nan)
# 按规则赋值:列i的非空位置填5-i
for col in res.columns:
    res[col] = res[col].mask(res[col].notna(), 5 - col)
# 固定列顺序为1-4,补全可能缺失的列
res = res.reindex(columns=[1,2,3,4]).reset_index()

运行后得到的输出和预期完全匹配:

group    1    2    3    4
0      1  4.0  3.0  2.0  1.0
1      2  4.0  3.0  NaN  NaN
2      3  4.0  3.0  NaN  NaN
3      4  4.0  NaN  NaN  NaN
4      5  4.0  3.0  2.0  NaN
5      6  4.0  NaN  NaN  NaN

实现逻辑说明

  • pd.crosstab会自动统计每个group下各个alt.var值的出现次数,出现过的值计数≥1,未出现的为0
  • 把计数为0的位置替换为NaN,标记为缺失
  • 用mask方法对非空位置直接赋值5-列名,不需要额外写判断逻辑,运行效率更高
  • 用reindex强制指定列顺序为1到4,避免因部分分组缺少高值alt.var导致列不全的问题
  • 最后把group从行索引转回普通数据列即可
    如果需要把空值显示为NA而非浮点型的NaN,可以在最后追加一句res = res.astype('Int64'),pandas会自动把整数列的空值渲染为NA。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:45:32