如何按第一个DataFrame的列交错合并两个DataFrame并保留指定顺序
按指定顺序合并两个DataFrame的解决方案
你需要保留df1的原始行顺序,同时将df2中对应id的行紧跟在df1对应行的下方。之前用pd.concat([df1, df2]).sort_index().reset_index()无效的原因是,该方法仅按原DataFrame的索引排序,而df2的行顺序和df1的id顺序不匹配,无法实现按id对应分组的需求。
解决步骤及代码示例
- 构造示例数据(已有数据可跳过):
import pandas as pd df1 = pd.DataFrame({ 'X': ['f', 'a', 'd'], 'Y': ['g', 'b', 'e'], 'avg': [30, 20, 10], 'id': [3, 1, 2] }) df2 = pd.DataFrame({ 'X': ['D', 'A', 'F'], 'Y': ['E', 'B', 'G'], 'avg': [10, 0, 20], 'id': [2, 1, 3] })
- 添加辅助列实现排序控制:
# 给df1添加order列,记录原始行的顺序 df1['order'] = df1.index # 给df2匹配对应id在df1中的order值 df2 = df2.merge(df1[['id', 'order']], on='id', how='left') # 添加source列区分原始DataFrame,保证每组内先显示df1的行 df1['source'] = 0 df2['source'] = 1 # 合并并排序 combined = pd.concat([df1, df2]).sort_values(by=['order', 'source']) # 移除辅助列并重置索引 result = combined.drop(columns=['order', 'source']).reset_index(drop=True) print(result)
输出结果
X Y avg id 0 f g 30 3 1 F G 20 3 2 a b 20 1 3 A B 0 1 4 d e 10 2 5 D E 10 2
内容的提问来源于stack exchange,提问作者Ahmad
相关产品推荐
相关产品推荐

