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

如何在Pandas中按日期统计指定ID列表的数量?

解决方案:只统计指定ID的日期出现次数

嘿,这个场景太常见了!你完全没必要先对整个DataFrame做groupby再过滤——那样既浪费算力(毕竟你只关心少数ID),还得额外处理不需要的结果。直接先过滤出目标ID的数据,再做分组统计,一步到位效率更高。

下面给你两种常用的实现方式,按需选择:

方法1:直接过滤+分组统计(最简洁高效)

先把DataFrame中属于目标ID列表的行筛选出来,再按「日期+ID」分组计数:

import pandas as pd

# 假设你的DataFrame叫df,包含列'date'(日期)和'id'(ID)
# 目标ID列表示例:target_ids = ['A', 'C', 'E']

# 第一步:过滤出仅包含目标ID的行
filtered_df = df[df['id'].isin(target_ids)]

# 第二步:按日期和ID分组,统计出现次数
count_result = filtered_df.groupby(['date', 'id']).size()

# 如果需要转成更易读的宽表形式,用unstack()补全缺失值为0
count_result_unstacked = count_result.unstack(fill_value=0)
  • size() 会统计每组的行数(也就是该ID在当天的出现次数);如果你的列存在缺失值,也可以用count()统计非空值数量,根据数据情况选择。
  • 这种方法的核心优势是只处理你需要的数据,在大DataFrame上的性能会比先groupby再过滤好很多。

方法2:保留所有日期+目标ID(包括出现次数为0的情况)

如果需要确保每个目标ID在每一个日期都有记录(哪怕当天没出现,次数显示0),可以用重新索引的方式补全完整组合:

# 先按方法1得到基础统计结果
filtered_count = df[df['id'].isin(target_ids)].groupby(['date', 'id']).size()

# 生成所有日期+目标ID的完整组合索引,重新对齐并填充0
full_dates = df['date'].unique()
full_index = pd.MultiIndex.from_product([full_dates, target_ids], names=['date', 'id'])
full_count_result = filtered_count.reindex(full_index, fill_value=0)

这样得到的结果会包含所有日期和目标ID的组合,没有出现的ID对应日期的次数自动填充为0,适合需要完整时间序列统计的场景。

额外小提示

  • 如果你的日期列是字符串类型,记得先转成datetime格式:df['date'] = pd.to_datetime(df['date']),避免分组时因为格式问题出错。
  • 哪怕目标ID列表规模不小,isin()的性能依然很可靠,Pandas对这个操作做了专门优化,不用担心效率问题。

内容的提问来源于stack exchange,提问作者FunnyChef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:17:49