You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拼接两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:31:36