如何通过另一列聚合DataFrame单列数据并重构数据格式?
解决方法
不用嵌套循环,用Pandas的分组和透视功能就能轻松实现,步骤如下:
步骤1:准备数据并替换NA为0
先把x列的NA替换成0,保证后续计算统一:
import pandas as pd import numpy as np # 构造原始DataFrame(已有数据可跳过此步) raw_data = { 'record': [1,1,1,2,3,3,4,5,6,6], 'x': [np.nan, 2, 1, np.nan, 9, 1, 2, np.nan,4, np.nan] } df = pd.DataFrame(raw_data) # 将NA替换为0并转为整数类型 df['x'] = df['x'].fillna(0).astype(int)
步骤2:给每个分组添加组内序号
为了把同一record下的多个x值分到不同列,给每个record组内的行添加递增序号:
df['col_num'] = df.groupby('record').cumcount()
步骤3:透视转换为宽表
用pivot函数转成目标格式:行对应唯一record,列对应组内序号,值为x:
result_df = df.pivot(index='record', columns='col_num', values='x')
步骤4:填充缺失值并整理格式
把透视后缺失的位置补0,重置索引让record成为普通列,再转为整数类型:
result_df = result_df.fillna(0).astype(int).reset_index()
最终输出
运行后result_df的内容即为你需要的格式:
record 0 1 2 0 1 0 2 1 1 2 0 0 0 2 3 9 1 0 3 4 2 0 0 4 5 0 0 0 5 6 4 0 0
如果需要纯文本无表头格式,可执行:
print(result_df.to_string(index=False, header=False))
输出结果:
1 0 2 1 2 0 0 0 3 9 1 0 4 2 0 0 5 0 0 0 6 4 0 0
内容的提问来源于stack exchange,提问作者LDiamond
相关产品推荐
相关产品推荐

