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

如何调整Pandas外连接DataFrame后的行顺序至目标格式?

Pandas合并DataFrame后自定义排序需求

我有两个DataFrame df1和df2,想要对这两个DataFrame进行对比。

import pandas as pd

df1 = pd.DataFrame({'Column1': ['f','c','b','d','e','g','h'], 
                    'Column2': ['1','2','3','4','5','7','8']})

df2 = pd.DataFrame({'Column1': ['f','b','d','e','a','g'], 
                    'Column2': ['1','3','4','5','6','7']})

为了对比DataFrame,我使用了Pandas的merge方法,代码如下:

df = pd.merge(df1,df2, how="outer", on="Column1")

得到的结果如下:

Column1 Column2_x Column2_y
0       f         1         1
1       c         2       NaN
2       b         3         3
3       d         4         4
4       e         5         5
5       g         7         7
6       h         8       NaN
7       a       NaN         6

但我不想要这个结果,我期望的输出如下:

Column1 Column2_x Column2_y
0       f         1         1
1       c         2       NaN
2       b         3         3
3       d         4         4
4       e         5         5
5       a       NaN         6
6       g         7         7
7       h         8       NaN

请问如何才能得到期望的输出?


解决方案

你需要的是对合并后的DataFrame按自定义顺序重新排序,核心是给每个Column1的元素指定排序优先级。这里有两种可行的方式:

方法一:直接指定完整排序序列

如果你的目标顺序是固定的,可以直接定义一个排序列表,然后用reindex调整顺序:

import pandas as pd

df1 = pd.DataFrame({'Column1': ['f','c','b','d','e','g','h'], 
                    'Column2': ['1','2','3','4','5','7','8']})

df2 = pd.DataFrame({'Column1': ['f','b','d','e','a','g'], 
                    'Column2': ['1','3','4','5','6','7']})

# 执行合并
df = pd.merge(df1, df2, how="outer", on="Column1")

# 定义期望的排序顺序
custom_order = ['f', 'c', 'b', 'd', 'e', 'a', 'g', 'h']

# 按自定义顺序重新排列并重置索引
df_sorted = df.set_index('Column1').reindex(custom_order).reset_index()
print(df_sorted)

运行后输出:

Column1 Column2_x Column2_y
0       f         1         1
1       c         2       NaN
2       b         3         3
3       d         4         4
4       e         5         5
5       a       NaN         6
6       g         7         7
7       h         8       NaN

方法二:基于原DataFrame顺序动态排序

如果后续数据可能变化,不想硬编码排序列表,可以通过给每个元素分配排序权重来实现:

import pandas as pd

df1 = pd.DataFrame({'Column1': ['f','c','b','d','e','g','h'], 
                    'Column2': ['1','2','3','4','5','7','8']})

df2 = pd.DataFrame({'Column1': ['f','b','d','e','a','g'], 
                    'Column2': ['1','3','4','5','6','7']})

# 执行合并
df = pd.merge(df1, df2, how="outer", on="Column1")

# 给df1中的元素按原有顺序分配整数权重
order_map = {val: idx for idx, val in enumerate(df1['Column1'])}
# 给df2独有的元素'a'分配介于'e'(权重4)和'g'(权重5)之间的权重
order_map['a'] = 4.5

# 添加排序键、排序后删除临时列并重置索引
df['sort_weight'] = df['Column1'].map(order_map)
df_sorted = df.sort_values('sort_weight').drop('sort_weight', axis=1).reset_index(drop=True)
print(df_sorted)

这种方式更灵活,若后续df1的顺序调整,无需修改硬编码的排序列表,只需保证order_map的生成逻辑正确即可。


内容的提问来源于stack exchange,提问作者xiiais

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:15:45