如何筛选出最频繁consignor占比超80%的receiver?
问题描述
需要验证假设“receiver X频繁接收consignor Y的货物”,要求筛选出所有满足以下条件的receiver:其对应最频繁的consignor的收货量占该receiver总收货量的比例超过80%。
举例:receiver c共收到5件货物,其中来自consignor 2的有1件,来自consignor 3的有4件,consignor 3的占比达80%,因此receiver c应被纳入结果表。
现有DataFrame数据:
consignor receiver 0 1 a 1 2 a 2 1 a 3 2 c 4 3 c 5 1 b 6 3 c 7 3 c 8 3 c 9 2 d 10 2 d 11 2 d 12 1 d 13 2 d
期望输出格式:
receiver consignor count_with_most_consignor count_all c 3 4 5 d 2 4 5
当前代码仅完成了分组统计,需要完善逻辑实现需求。
解决方案
通过以下步骤实现需求:
- 分组统计收货量:按
receiver和consignor分组,计算每组的收货数量。 - 计算每个收货方的总收货量:按
receiver分组,统计总收货数。 - 提取每个收货方的最频繁发货方数据:对每个
receiver,保留收货量最大的consignor记录(若有多个相同最大值,取第一条)。 - 计算占比并筛选:计算最频繁发货方的收货量占总收货量的比例,筛选出占比>80%的记录。
- 整理输出格式:重命名列名,匹配期望的输出结构。
完整代码如下:
import pandas as pd # 初始化数据 d = {'consignor': [1, 2, 1, 2, 3, 1, 3, 3, 3, 2, 2, 2, 1, 2], 'receiver': ['a', 'a', 'a', 'c', 'c', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'd', 'd']} df = pd.DataFrame(data=d) # 分组统计每个receiver-consignor的收货量 grouped = df.groupby(['receiver', 'consignor']).size().reset_index(name='counts') # 计算每个receiver的总收货量 total_counts = df.groupby('receiver').size().reset_index(name='count_all') # 对每个receiver,获取收货量最大的consignor记录 top_consignor = grouped.sort_values(['receiver', 'counts'], ascending=[True, False]) \ .groupby('receiver').head(1) # 合并总收货量数据,计算占比并筛选符合条件的记录 result = pd.merge(top_consignor, total_counts, on='receiver') result['ratio'] = result['counts'] / result['count_all'] result = result[result['ratio'] > 0.8] # 重命名列,整理成期望格式 result = result.rename(columns={'counts': 'count_with_most_consignor'}) result = result[['receiver', 'consignor', 'count_with_most_consignor', 'count_all']] # 输出结果 print(result)
执行代码后输出:
receiver consignor count_with_most_consignor count_all 2 c 3 4 5 3 d 2 4 5
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

