如何基于同ID下的comments/priority唯一性合并两个Pandas DataFrame
解决方案
先确认你的示例数据:
import pandas as pd df_test = pd.DataFrame(data=None, columns = ['file', 'comments', 'priority', 'id']) df_test.file = ['file_1', 'file_1_v2', 'file_2_old', 'file_2_new', 'file_3', 'file_4_v1', 'file_4_v2'] df_test.comments = ['abc', 'def', 'xyz', 'ghi', 'pqr', 'uvw', 'pqr'] df_test.priority = [10, 100, 15, 25, 50, 20, 40] df_test.id = [1, 1, 2, 2, 3, 4, 4] df_test2 = pd.DataFrame(data=None, columns = ['file', 'comments', 'priority', 'id']) df_test2.file = ['file_1', 'file_1_test', 'file_2_old', 'file_3_s', 'file_4_v3', 'file_4_v4'] df_test2.comments = ['abd', 'def', 'xya', 'pqr', 'uvw', 'pqr'] df_test2.priority = [10, 110, 35, 50, 20, 50] df_test2.id = [1, 1, 2, 3, 4, 4]
你之前的全局去重会跨id判断重复,不符合需求。要实现按id维度校验(comments, priority)组合的唯一性,可以按以下步骤操作:
提取
df_test中每个id对应的(comments, priority)唯一组合集合
这一步是为了快速判断df_test2的行在对应id下是否已经存在:# 按id分组,把每个id下的(comments,priority)对存成集合 id_existing_pairs = df_test.groupby('id')[['comments', 'priority']].apply( lambda group: set(zip(group['comments'], group['priority'])) ).to_dict()筛选
df_test2中符合条件的行
遍历df_test2的每一行,检查当前行的(comments,priority)是否不在对应id的已存在集合中:# 生成筛选掩码:符合条件的行标记为True filter_mask = df_test2.apply( lambda row: (row['comments'], row['priority']) not in id_existing_pairs.get(row['id'], set()), axis=1 ) # 提取需要添加的行 rows_to_add = df_test2[filter_mask]合并到原DataFrame
把筛选出来的行和df_test拼接,重置索引:final_df = pd.concat([df_test, rows_to_add], ignore_index=True)
验证结果
运行后,rows_to_add会包含df_test2的第1、2、3、6行(对应索引0、1、2、5),和你预期的一致:
- 第1行(id=1):
('abd',10)不在df_test的id=1组合里 - 第2行(id=1):
('def',110)不在df_test的id=1组合里 - 第3行(id=2):
('xya',35)不在df_test的id=2组合里 - 第6行(id=4):
('pqr',50)不在df_test的id=4组合里(df_test的id=4只有('uvw',20)和('pqr',40))
而df_test2中被排除的行:
- 第4行(id=3):
('pqr',50)和df_test的id=3组合重复 - 第5行(id=4):
('uvw',20)和df_test的id=4组合重复
内容的提问来源于stack exchange,提问作者Marcus K.
相关产品推荐
相关产品推荐

