如何合并15个列名相同但索引可能重复的DataFrame?
合并多个同列名、索引可能重复的DataFrame方案
嘿,我来帮你搞定合并15个列名相同但索引可能重复的DataFrame的问题!先从你提到的测试数据开始,咱们先把生成测试数据的代码贴出来(方便你复现场景):
import pandas as pd import numpy as np # 生成15个测试DataFrame的示例 dfs = [] for i in range(15): # 生成带重复索引的DF,列名都是A、B、C df = pd.DataFrame( {'A': np.random.randint(1, 10, 5), 'B': np.random.randn(5), 'C': np.random.choice(['X', 'Y'], 5)}, index=np.random.choice([1, 2, 3, 4, 5], 5) # 故意生成重复索引 ) dfs.append(df)
接下来分几种最常用的合并场景来介绍,你可以根据自己的需求选:
场景1:保留所有原始行(包括重复索引)
这是最基础的合并方式,pd.concat会自动对齐所有相同列名的列,不管索引是否重复,所有DF里的行都会原封不动保留下来:
# 直接合并列表里的15个DF merged_df = pd.concat(dfs)
合并后,索引会保留每个DF原来的索引值(哪怕重复),列还是原来的A、B、C三列,不会新增列。
场景2:忽略原索引,生成连续新索引
如果你不需要保留原有的索引,只想把所有数据按顺序堆叠起来,只需要给concat加个ignore_index=True参数:
merged_df = pd.concat(dfs, ignore_index=True)
这样新的DF索引会变成从0开始的连续整数,完全和原索引无关。
场景3:对重复索引的行做聚合处理
如果同一个索引在多个DF里都有数据,你想把这些行合并成一行(比如求和、取均值、保留第一个值),可以先合并再按索引分组聚合:
# 先合并所有DF,再按索引分组求和 merged_df = pd.concat(dfs).groupby(level=0).sum() # 或者取每组的第一个值 merged_df = pd.concat(dfs).groupby(level=0).first() # 或者取均值 merged_df = pd.concat(dfs).groupby(level=0).mean()
这里level=0表示按最外层索引分组(适合单索引的情况),你可以根据需求替换聚合函数,比如max()、min()甚至自定义函数。
几个小提醒
- 确保所有DF的列名完全一致!如果有大小写差异(比如有的是
a有的是A),先统一列名:# 把所有DF的列名转成小写 for df in dfs: df.columns = df.columns.str.lower() - 合并后如果有缺失值,可以用
merged_df.fillna()处理,比如填充0或者前向填充:merged_df = merged_df.fillna(0) # 用0填充NaN merged_df = merged_df.ffill() # 前向填充
内容的提问来源于stack exchange,提问作者Calculus
相关产品推荐
相关产品推荐

