如何对比两个Pandas DataFrame提取指定差异行生成新DataFrame
Pandas DataFrame 差异对比需求
我有两个Pandas DataFrame,需要对比找出差异:
- df1包含唯一ID列、文本列和数值列,每个ID仅对应一行
- df2结构相同,但同一ID可能有多条记录
- 需将df1中每个ID的对应列,与df2中所有匹配该ID的行对比,把差异行存入新的df3
- 补充规则:如果df1中的ID在df2里没出现,df3不包含该行
df1 数据示例
import pandas as pd data1 = {'ID':['L1', 'L2', 'L3', 'L4'], 'Text':['1A', '1B','1C','1D'], 'Num':[1, 2, 3, 4]} df1 = pd.DataFrame(data1) print(df1)
| ID | Text | Num |
|---|---|---|
| L1 | 1A | 1 |
| L2 | 1B | 2 |
| L3 | 1C | 3 |
| L4 | 1D | 4 |
df2 数据示例
data2 = {'ID':['L1', 'L2', 'L3', 'L1', 'L2', 'L3'], 'Text':['1A','1B','1C','2A','2B','1C'], 'Num':[1, 2, 3, 11,2,123]} df2 = pd.DataFrame(data2) print(df2)
| ID | Text | Num |
|---|---|---|
| L1 | 1A | 1 |
| L2 | 1B | 2 |
| L3 | 1C | 3 |
| L1 | 2A | 11 |
| L2 | 2B | 2 |
| L3 | 1C | 123 |
期望输出 df3
| ID | Text | Num |
|---|---|---|
| L1 | 2A | 11 |
| L2 | 2B | 2 |
| L3 | 1C | 123 |
解决方案代码
通过合并+筛选的方式实现需求:
- 按ID合并df1和df2,保留df2的所有行并带上df1的对应值
- 对比Text和Num列,筛选出与df1中对应ID值不同的记录
- 整理为目标格式的df3
import pandas as pd # 定义原始数据 data1 = {'ID':['L1', 'L2', 'L3', 'L4'], 'Text':['1A', '1B','1C','1D'], 'Num':[1, 2, 3, 4]} df1 = pd.DataFrame(data1) data2 = {'ID':['L1', 'L2', 'L3', 'L1', 'L2', 'L3'], 'Text':['1A','1B','1C','2A','2B','1C'], 'Num':[1, 2, 3, 11,2,123]} df2 = pd.DataFrame(data2) # 按ID合并两个DataFrame,保留df2的匹配行 merged = df2.merge(df1, on='ID', suffixes=('_df2', '_df1'), how='inner') # 筛选出Text或Num与df1对应值不同的行 diff_mask = (merged['Text_df2'] != merged['Text_df1']) | (merged['Num_df2'] != merged['Num_df1']) df3 = merged[diff_mask][['ID', 'Text_df2', 'Num_df2']].rename(columns={'Text_df2':'Text', 'Num_df2':'Num'}) print(df3)
运行结果:
ID Text Num 0 L1 2A 11 1 L2 2B 2 2 L3 1C 123
内容的提问来源于stack exchange,提问作者ashrest23
相关产品推荐
相关产品推荐

