如何基于指定列合并DataFrame并交错排列其行(支持多DataFrame)
基于指定列合并并交错排列多个DataFrame的行
给定以下DataFrame:
>>> df1 A B 0 1 a 1 2 a 2 3 a 3 4 a >>> df2 A B 0 1 b 1 2 b 2 3 b 3 5 b
需要基于A列合并(仅保留所有DataFrame共有的A值),并将不同DataFrame中同A值的行交错排列,得到如下结果:
A B 0 1 a 0 1 b 1 2 a 1 2 b 2 3 a 2 3 b
常规merge方法会将列并排,无法满足需求,同时需要支持3个及以上DataFrame的处理。
解决方案步骤
- 为每个DataFrame添加临时标识列,区分不同数据源
- 合并所有DataFrame
- 筛选出所有DataFrame共有的
A值(取交集) - 按
A列和数据源标识排序,实现同A值的行交错排列 - 调整索引至目标格式,移除临时标识列
代码实现
import pandas as pd # 示例DataFrame df1 = pd.DataFrame({'A': [1,2,3,4], 'B': ['a','a','a','a']}) df2 = pd.DataFrame({'A': [1,2,3,5], 'B': ['b','b','b','b']}) df3 = pd.DataFrame({'A': [1,2,3,6], 'B': ['c','c','c','c']}) # 支持扩展到3个及以上DF # 将所有需要处理的DataFrame存入列表 dfs = [df1, df2, df3] # 为每个DF添加数据源标识并合并 dfs_with_source = [df.assign(source=i) for i, df in enumerate(dfs)] combined = pd.concat(dfs_with_source) # 筛选所有DF共有的A值 common_A = set.intersection(*[set(df['A']) for df in dfs]) combined = combined[combined['A'].isin(common_A)] # 按A列和数据源排序,确保同A值的行交错排列 combined = combined.sort_values(by=['A', 'source']) # 生成目标索引:每个A值对应统一的索引编号 combined['new_index'] = combined.groupby('A').ngroup() # 调整索引并移除临时列 result = combined.set_index('new_index').drop('source', axis=1) print(result)
3个DataFrame的输出结果
A B new_index 0 1 a 0 1 b 0 1 c 1 2 a 1 2 b 1 2 c 2 3 a 2 3 b 2 3 c
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

