如何合并DataFrame列表:同列拼接、按索引去重且不生成后缀
解决方法
要同时满足同名列无后缀拼接和基于索引列去重的需求,你可以用pd.concat先合并所有DataFrame,再通过groupby按索引列聚合,处理同列的重复数据。具体步骤如下:
步骤说明
- 合并所有DataFrame到一个统一的数据集,保留所有行(包括重复的索引行)
- 按指定的索引列分组,对每组内的列值进行聚合:优先保留非空值,确保同一索引只留唯一一行
示例代码
import pandas as pd df1 = pd.DataFrame({'WeekCom':['2020-01-01','2020-01-02','2020-01-02','2020-01-03'],'Y':[2020,2020,2020,2020],'QT':['Q1','Q1','Q1','Q1'],'M':['Jan','Jan','Jan','Jan'],'W':['W1','W1','W1','W2'],'Col_X':[0,1,1,2],'Col_Y':[3,0,0,1]}) df2 = pd.DataFrame({'WeekCom':['2020-01-02','2020-01-04'],'Y':[2020,2020],'QT':['Q1','Q1'],'M':['Jan','Jan'],'W':['W1','W2'],'Col_X':[1,3],'Col_Z':[3,3]}) dataframe_list = [df1, df2] list_of_indices = ['WeekCom','Y','QT','M','W'] # 你的索引列列表 # 1. 合并所有DataFrame,同名列无后缀 combined = pd.concat(dataframe_list) # 2. 按索引列分组,聚合生成唯一行 merged_df = combined.groupby(list_of_indices, as_index=False).agg( lambda x: x.ffill().bfill().iloc[0] ) print(merged_df)
代码解释
pd.concat(dataframe_list):纵向拼接所有DataFrame,同名列直接保留,不会生成_x/_y后缀groupby(list_of_indices):按指定索引列分组,把同一索引的重复行归为一组agg(lambda x: x.ffill().bfill().iloc[0]):对每组内的列值,先前后填充空值,再取第一行——既合并了不同DataFrame的有效数据,又确保每组只留唯一行
如果你的场景中,同一索引行的同名列不会出现冲突(比如df1和df2同索引行的Col_X值一致),可以简化聚合逻辑为agg('first')或agg('last'),直接取组内第一行/最后一行即可。
内容的提问来源于stack exchange,提问作者Chronicles
相关产品推荐
相关产品推荐

