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

基于两列顺序合并两个Pandas DataFrames的实现求助

Pandas 基于同名逻辑列交错合并两个DataFrame

你之前的方法报错核心原因是:两个DataFrame的列名不统一,concat后y1和y2是独立列,其中一个列在另一个DataFrame中全为NaN,用这两列排序会触发逻辑错误。正确思路是先统一列名,将y1和y2合并为同一排序键,再合并排序。


步骤1:统一列名

将两个DataFrame的列名重命名为目标格式,确保合并后列对齐:

import pandas as pd

# 示例数据
df1 = pd.DataFrame({
    'x1': [25, 16, 41, 3, 25],
    'y1': [12, 13, 13, 14, 17],
    'z1': [0.71, 0.63, 0.84, 0.55, 0.49]
})

df2 = pd.DataFrame({
    'x2': [73, 105, 64, 92, 92, 81],
    'y2': [11, 12, 12, 13, 15, 18],
    'z2': [0.31, 0.57, 0.86, 0.42, 0.63, 0.74]
})

# 重命名列
df1_renamed = df1.rename(columns={'x1': 'x3', 'y1': 'y3', 'z1': 'z3'})
df2_renamed = df2.rename(columns={'x2': 'x3', 'y2': 'y3', 'z2': 'z3'})

步骤2:合并并排序

如果仅需要按y3升序排列,直接合并后排序即可:

df3 = pd.concat([df1_renamed, df2_renamed]).sort_values(by='y3', ascending=True).reset_index(drop=True)

步骤3:保留原DataFrame的行顺序(可选)

如果需要在相同y3值下优先显示df1的行,再显示df2的行,可以添加辅助标记列控制排序优先级:

# 添加来源标记
df1_renamed['source'] = 0
df2_renamed['source'] = 1

# 先按y3排序,再按来源标记确保df1行在前
df3 = pd.concat([df1_renamed, df2_renamed])\
    .sort_values(by=['y3', 'source'], ascending=True)\
    .drop('source', axis=1)\
    .reset_index(drop=True)

运行后得到的df3与期望结果一致:

x3  y3    z3
0   73  11  0.31
1   25  12  0.71
2  105  12  0.57
3   64  12  0.86
4   16  13  0.63
5   41  13  0.84
6   92  13  0.42
7    3  14  0.55
8   92  15  0.63
9   25  17  0.49
10  81  18  0.74

补充说明

  • 对于大型DataFrame,concat和sort_values都是Pandas优化过的操作,性能可以满足需求;
  • 如果需要更精细的排序规则(比如同一y3下保留原DataFrame内的行顺序),可以保留原索引并加入排序条件:sort_values(by=['y3', 'source', 'index'])。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:05:36