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

Pandas实现多行合并为一行多列的方法求助

用Pandas优雅实现每3行合并为一行的需求

嗨,针对你想要把DataFrame每3行合并成一行的需求,这里有个完全基于Pandas原生方法的优雅实现,不用写循环,代码简洁还高效,正好符合你的要求:

具体实现代码

首先,我们先还原你的原始DataFrame:

import pandas as pd
import numpy as np

# 构造原始数据
df = pd.DataFrame({
    'id': [0, 1, 2, 3, 4, 5, 6, 7],
    'C1': [1, 2, 2, 5, 7, 9, 11, 13],
    'C2': [2, 3, 4, 6, 8, 10, 12, 14]
})

接下来就是核心的合并操作:

# 1. 生成每3行一组的分组键,索引0-2为组0,3-5为组1,以此类推
group_key = df.index // 3

# 2. 按分组键分组,去掉原id列后将组内行转成列,保留层级关系
grouped = df.groupby(group_key).apply(lambda x: x.drop('id', axis=1).reset_index(drop=True).unstack())

# 3. 调整列名格式,把层级列名转换成C1、C1_1、C1_2的样式
grouped.columns = grouped.columns.map(lambda col: f"{col[0]}_{col[1]}" if col[1] != 0 else col[0])

# 4. 重置索引作为新的id列,并清理索引名
result = grouped.reset_index().rename(columns={'index': 'id'})

# 5. 可选操作:删除包含NaN的行(如果不需要最后一行不完整的数据)
result_clean = result.dropna(how='any')

执行后,result就是你想要的格式:

id  C1  C2  C1_1  C2_1  C1_2  C2_2
0   0   1   2   2.0   3.0   2.0   4.0
1   1   5   6   7.0   8.0   9.0  10.0
2   2  11  12  13.0  14.0   NaN   NaN

如果执行result_clean,就会得到去掉含NaN行的结果:

id  C1  C2  C1_1  C2_1  C1_2  C2_2
0   0   1   2   2.0   3.0   2.0   4.0
1   1   5   6   7.0   8.0   9.0  10.0

关键逻辑解释

  • 分组键生成:df.index // 3是个很巧妙的技巧,它会自动把连续3个索引归为一组,完美实现每3行一组的划分,不用手动指定分组范围。
  • groupby + unstack:我们先在每组内去掉原来的id列(因为新的id是组号),然后重置组内索引为0、1、2,再用unstack()把行转成列,这样每组的3行就变成了多列的结构。
  • 列名调整:通过map方法把分组后生成的层级列名(比如('C1', 1))转换成C1_1的格式,完全符合你需要的命名规则。

这种方法完全利用了Pandas的向量化操作,比循环实现效率高得多,尤其是处理大数据集时优势会更明显,而且代码可读性也很强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:22:28