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
相关产品推荐
相关产品推荐

