如何找出两个DataFrame中cust_id对应的town_id变更记录并生成DataFrame?
对比DataFrame找出town_id变更的记录
直接用pandas的合并+筛选就能搞定,步骤如下:
1. 准备示例数据
import pandas as pd # 构建df1 df1 = pd.DataFrame({ 'name': ['cxa', 'cxb', 'cxc', 'cxd'], 'cust_id': ['c1001', 'c1002', 'c1003', 'c1004'], 'town_id': ['t001', 't001', 't001', 't002'] }, index=[1,2,3,4]) # 构建df2 df2 = pd.DataFrame({ 'name': ['cxa', 'cxb', 'cxd', 'cxe', 'cxf'], 'cust_id': ['c1001', 'c1002', 'c1004', 'c1005', 'c1006'], 'town_id': ['t002', 't001', 't001', 't001', 't001'] }, index=[1,2,3,4,5])
2. 合并并筛选变更记录
# 按cust_id合并两个DataFrame,用后缀区分来源 merged_df = pd.merge(df1, df2, on='cust_id', suffixes=('_initial', '_latter')) # 筛选town_id发生变化的行 changed_records = merged_df[merged_df['town_id_initial'] != merged_df['town_id_latter']] # 整理成期望的输出格式:保留name(取df1的即可,示例中两边name一致)、cust_id、初始和后续town_id result_df = changed_records[['name_initial', 'cust_id', 'town_id_initial', 'town_id_latter']].rename(columns={'name_initial': 'name'}) # 重置索引(可选,让输出和示例格式更匹配) result_df = result_df.reset_index(drop=True) result_df.index += 1 # 让索引从1开始,和示例一致 print(result_df)
输出结果
name cust_id town_id_initial town_id_latter 1 cxa c1001 t001 t002 2 cxd c1004 t002 t001
说明
- 用
pd.merge的suffixes参数可以自动给来自不同DataFrame的同名列加上后缀,避免列名冲突 - 布尔索引
merged_df['town_id_initial'] != merged_df['town_id_latter']直接筛选出town_id变更的记录 - 如果df1和df2中同一cust_id的name不一致,可根据需求选择保留哪一方的name,或者都保留
内容的提问来源于stack exchange,提问作者Alhpa Delta
相关产品推荐
相关产品推荐

