如何调整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
相关产品推荐
相关产品推荐

