如何按组内元素数量将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
相关产品推荐
相关产品推荐

