Pandas不同长度DataFrame横向concat重复行对齐问题求解
实现思路
核心是给相同分组的重复行打组内序号标记,再用外连接对齐:
- 对两个DataFrame分别按
emp_id、emp_name分组,新增组内累计序号列,标记同一个用户的第N条记录 - 将
emp_id、emp_name、组内序号作为联合键,对两个DataFrame执行外连接 - 调整列名、排序后即可得到对齐后的差异对比结果
完整可运行代码
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
相关产品推荐
相关产品推荐

