如何拼接两个Pandas DataFrame并同时保留两者的原有顺序?
问题
我正在对比两个存储新旧值的Pandas DataFrame,部分id在新数据中被删除或新增,导致两者索引不一致。我可以将id设为索引,以列为轴、'First'和'Second'为键拼接DataFrame,但无法同时保留两者的顺序——当前仅保留了data1的顺序,我希望data2的顺序也能保留。
我尝试的代码:
data1={'id':[1, 2, 3, 4, 5],'value':[10, 25, 12, 100, 26]} data2={'id':[1, 2, 6, 4, 5],'value':[10, 24, 48, 100, 60]} df = pd.DataFrame(data1) df2 = pd.DataFrame(data2) df_both = pd.concat([df.set_index('id'), df2.set_index('id')], axis='columns', keys=['First', 'Second']) print(df_both)
得到的输出:
First Second value value id 1 10.0 10.0 2 25.0 24.0 3 12.0 NaN 4 100.0 100.0 5 26.0 60.0 6 NaN 48.0
由于id 6在data1中不存在,它被放在了DataFrame的底部。
我期望得到的结果:
First Second value value id 1 10.0 10.0 2 25.0 24.0 3 12.0 NaN 6 NaN 48.0 4 100.0 100.0 5 26.0 60.0
我希望被删除和新增的行都能保持它们在原DataFrame中的位置。
解决方案
要同时保留两个DataFrame中id的原始顺序,核心是先构建一个包含所有id且顺序符合预期的自定义索引——保留data1原有id顺序的同时,把data2独有的id插入到它们在data2里的对应位置,最后用这个索引重新排列拼接后的DataFrame。
具体代码实现:
import pandas as pd data1={'id':[1, 2, 3, 4, 5],'value':[10, 25, 12, 100, 26]} data2={'id':[1, 2, 6, 4, 5],'value':[10, 24, 48, 100, 60]} df = pd.DataFrame(data1) df2 = pd.DataFrame(data2) # 完成基础的拼接操作 df_both = pd.concat([df.set_index('id'), df2.set_index('id')], axis='columns', keys=['First', 'Second']) # 构建符合需求的自定义索引顺序 custom_order = df['id'].tolist() # 遍历data2的id,将data1中没有的id插入到对应位置 for idx, id_val in enumerate(df2['id']): if id_val not in custom_order: custom_order.insert(idx, id_val) # 用自定义索引重新排序拼接后的DataFrame df_both = df_both.reindex(custom_order) print(df_both)
运行后输出结果完全匹配预期:
First Second value value id 1 10.0 10.0 2 25.0 24.0 3 12.0 NaN 6 NaN 48.0 4 100.0 100.0 5 26.0 60.0
这个方法既保留了data1中原有的id顺序,又精准还原了data2新增id的位置,完美解决索引顺序不一致的问题。
内容的提问来源于stack exchange,提问作者Anna Ortega
相关产品推荐
相关产品推荐

