Python:按日期和箱号分组,求stage列confidential值的最大计数
解决步骤
1. 先统计每个箱号+日期的'confidential'出现次数
你当前的agg({'stage': 'size'})统计的是该组合下的总行数,不是stage为'confidential'的次数,得先修正这一步:
方法A:先过滤再分组
# 先筛选出stage为confidential的行,再按箱号和日期分组统计数量 conf_count = df[df['stage'] == 'confidential'].groupby(['box', 'date']).agg(confidential_count=('stage', 'size')).reset_index()
方法B:在agg中直接计算特定值的次数
# 不用提前过滤,通过lambda函数统计每组内stage等于confidential的行数 conf_count = df.groupby(['box', 'date']).agg(confidential_count=('stage', lambda x: (x == 'confidential').sum())).reset_index()
2. 提取每个日期的最大次数及对应箱号
接下来按日期找出confidential_count的最大值,匹配对应的箱号,两种常用方法:
方法1:用窗口函数排名
import pandas as pd # 给每个日期内的统计值降序排名,第一个出现的最大值排第1 conf_count['rank'] = conf_count.groupby('date')['confidential_count'].rank(ascending=False, method='first') # 筛选排名为1的记录,就是当日最大值对应的箱号 result = conf_count[conf_count['rank'] == 1].drop('rank', axis=1)
如果同一日期有多个箱号达到最大值(比如两个箱号都出现3次),这种方法会保留所有符合条件的记录。
方法2:分组找最大值后合并
# 先按日期分组,找出每个日期的最大confidential_count date_max = conf_count.groupby('date')['confidential_count'].max().reset_index(name='max_count') # 合并原统计结果和最大值表,筛选出等于最大值的记录 result = pd.merge(conf_count, date_max, on='date') result = result[result['confidential_count'] == result['max_count']].drop('max_count', axis=1)
示例验证
假设你的示例数据是:
| box | date | stage |
|---|---|---|
| AA | 2022/2/1 | confidential |
| AA | 2022/2/1 | confidential |
| AA | 2022/2/1 | confidential |
| AA | 2022/2/1 | normal |
| BB | 2022/3/1 | confidential |
| CC | 2022/3/1 | normal |
运行代码后,result会输出:
| box | date | confidential_count |
|---|---|---|
| AA | 2022/2/1 | 3 |
| BB | 2022/3/1 | 1 |
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

