You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选出最频繁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       

当前代码仅完成了分组统计,需要完善逻辑实现需求。

解决方案

通过以下步骤实现需求:

  1. 分组统计收货量:按receiver和consignor分组,计算每组的收货数量。
  2. 计算每个收货方的总收货量:按receiver分组,统计总收货数。
  3. 提取每个收货方的最频繁发货方数据:对每个receiver,保留收货量最大的consignor记录(若有多个相同最大值,取第一条)。
  4. 计算占比并筛选:计算最频繁发货方的收货量占总收货量的比例,筛选出占比>80%的记录。
  5. 整理输出格式:重命名列名,匹配期望的输出结构。

完整代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:40:50