如何用Pandas合并两个DataFrame为新增cnpj生成自增id
Pandas 合并两个DataFrame并自增生成新ID方案
需求说明
两个DataFrame结构如下:
- 第一个DataFrame(记为
df1):包含id、cnpj两个字段 - 第二个DataFrame(记为
df2):仅包含cnpj字段
合并规则: - 完整保留
df1的所有原有数据 - 仅追加
df2中存在、但df1未收录的独有cnpj条目 - 新增条目的
id从df1的最大id值开始,依次+1递增
实现代码
import pandas as pd # -------------------------- # 测试数据(和示例一致,可替换为实际数据) # -------------------------- df1 = pd.DataFrame({ 'id': [11, 12, 13, 14], 'cnpj': ['552030405560', '709050358572', '999680558533', '585680558542'] }) df2 = pd.DataFrame({ 'cnpj': ['552030405560', '709050358572', '999680558533', '585680558542', '658540805552', '498546543258'] }) # -------------------------- # 核心处理逻辑 # -------------------------- # 1. 筛选df2中不在df1内的新增cnpj new_entries = df2[~df2['cnpj'].isin(df1['cnpj'])].reset_index(drop=True) # 2. 为新增条目生成自增ID(兼容df1为空的边界场景) start_id = df1['id'].max() + 1 if not df1.empty else 1 new_entries['id'] = range(start_id, start_id + len(new_entries)) # 3. 拼接原有数据和新增数据,调整列顺序和原表对齐 final_df = pd.concat([df1, new_entries], ignore_index=True)[df1.columns]
运行结果
执行代码后得到的final_df完全匹配预期输出:
| id | cnpj |
|---|---|
| 11 | 552030405560 |
| 12 | 709050358572 |
| 13 | 999680558533 |
| 14 | 585680558542 |
| 15 | 658540805552 |
| 16 | 498546543258 |
补充说明
- 如果
cnpj字段存在格式不统一问题(比如部分是数值、部分是字符串,或存在前后空格),需要先做清洗:比如df1['cnpj'] = df1['cnpj'].astype(str).str.strip(),df2做相同处理后再做匹配,避免漏判重复值 - 如果需要去重后保留
df2中新增cnpj的首次出现顺序,当前逻辑已经默认满足,不需要额外调整
内容的提问来源于stack exchange,提问作者Caroline Leite
相关产品推荐
相关产品推荐

