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

Pandas不同长度DataFrame横向concat重复行对齐问题求解

实现思路

核心是给相同分组的重复行打组内序号标记,再用外连接对齐:

  1. 对两个DataFrame分别按emp_id、emp_name分组,新增组内累计序号列,标记同一个用户的第N条记录
  2. 将emp_id、emp_name、组内序号作为联合键,对两个DataFrame执行外连接
  3. 调整列名、排序后即可得到对齐后的差异对比结果

完整可运行代码

import pandas as pd

# 构造示例数据
df1 = pd.DataFrame({
    'emp_id': [1,2,3],
    'emp_name': ['sam','joe','john'],
    'counts': [0,0,0]
})
df2 = pd.DataFrame({
    'emp_id': [1,2,2,3],
    'emp_name': ['sam','joe','joe','john'],
    'counts': [0,0,1,0]
})

# 新增组内序号列
df1['grp_seq'] = df1.groupby(['emp_id','emp_name']).cumcount()
df2['grp_seq'] = df2.groupby(['emp_id','emp_name']).cumcount()

# 外连接合并,区分来源字段
merge_df = pd.merge(
    df1.add_prefix('df1_'),
    df2.add_prefix('df2_'),
    left_on=['df1_emp_id','df1_emp_name','df1_grp_seq'],
    right_on=['df2_emp_id','df2_emp_name','df2_grp_seq'],
    how='outer'
)

# 筛选需要的列并按emp_id排序
result = merge_df[[
    'df1_emp_id','df1_emp_name',
    'df2_emp_id','df2_emp_name'
]].sort_values('df2_emp_id').reset_index(drop=True)

print(result)

输出结果

df1_emp_id df1_emp_name  df2_emp_id df2_emp_name
0         1.0          sam           1          sam
1         2.0          joe           2          joe
2         NaN          NaN           2          joe
3         3.0         john           3         john

完全符合预期输出要求,无需额外拼接逻辑即可实现重复行对应位置显示空值的效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:06:04