如何在同类别同日期分组内自连接DataFrame并生成去重配对
实现同一DataFrame内同类别同日期的无重复行配对
思路说明
要完成同Category和date下的行配对且避免重复,核心是通过**自连接(内连接)**加双重过滤条件:
- 连接双方的
Category和date完全匹配 - 用
product_nr的大小关系(如a.product_nr < b.product_nr)剔除重复配对(避免A-B和B-A同时出现)
代码实现
1. 导入模块并创建模拟数据
import pandas as pd from pandas import Timestamp # 生成模拟数据集 df = pd.DataFrame({ 'date': {0: Timestamp('2021-08-01'), 1: Timestamp('2022-08-01'), 2: Timestamp('2021-08-02'), 3: Timestamp('2021-08-01'), 4: Timestamp('2022-08-01'), 5: Timestamp('2022-08-01'), 6: Timestamp('2022-08-01')}, 'product_nr': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7}, 'Category': {0: 'Cars', 1: 'Cars', 2: 'Cats', 3: 'Dogs', 4: 'Dogs', 5: 'Cats', 6: 'Cats'}, 'price': {0: '34', 1: '24', 2: '244', 3: '284', 4: '274', 5: '354', 6: '250'} })
2. 执行自连接并过滤重复配对
# 自连接,匹配同Category和同date的行 merged = df.merge( df, on=['Category', 'date'], suffixes=('', '_comp') # 为被比较的列添加后缀区分 ) # 过滤重复配对,只保留product_nr更小的一侧作为基准行 filtered = merged[merged['product_nr'] < merged['product_nr_comp']] # 整理为期望的输出格式 result = filtered[[ 'product_nr', 'Category', 'price', 'product_nr_comp' ]].rename(columns={'product_nr_comp': 'product_to_be_compared'}) print(result)
3. 结果说明
运行后得到的结果仅包含符合严格条件的配对:
product_nr Category price product_to_be_compared 6 6 Cats 354 7
这是因为模拟数据中只有Cats类别下2022-08-01的两个产品(6和7)满足同类别同日期的配对要求。
适配你给出的期望输出(同类别不限制日期)
如果你的期望输出是基于仅匹配同Category、不限制date的需求,只需修改连接条件,去掉date的匹配逻辑:
# 自连接,仅匹配同Category的行 merged = df.merge( df, on=['Category'], suffixes=('', '_comp') ) filtered = merged[merged['product_nr'] < merged['product_nr_comp']] result = filtered[[ 'product_nr', 'Category', 'price', 'product_nr_comp' ]].rename(columns={'product_nr_comp': 'product_to_be_compared'}) print(result)
运行后输出与你给出的期望结构一致(行顺序可能略有不同):
product_nr Category price product_to_be_compared 0 1 Cars 34 2 4 3 Cats 244 6 5 3 Cats 244 7 6 6 Cats 354 7 8 4 Dogs 284 5
内容的提问来源于stack exchange,提问作者user19495470
相关产品推荐
相关产品推荐

