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

如何在Colab中为CSV文件添加按日期统计类别数量的列

解决Pandas按日期+Class ID统计出现次数并添加计数列的问题

需求说明

需要在CSV数据中新增count列,统计同一日期下同一class_id的出现次数,按时间从晚到早的顺序标记为1、2、3...(例:2021-09-27的3条A类数据,最晚的标记1,次晚的2,最早的3)

原始数据

timestamp / class_id
2021-09-27 06:00:00 / A
2021-09-27 03:00:00 / A
2021-09-27 01:00:00 / A
2021-09-27 08:29:00 / C
2021-05-23 08:08:49 / B
2021-05-23 03:21:49 / B
2021-05-23 01:22:11 / C

期望结果

count / timestamp / class_id
1 / 2021-09-27 06:00:00 / A
2 / 2021-09-27 03:00:00 / A
3 / 2021-09-27 01:00:00 / A
1 / 2021-09-27 08:29:00 / C
1 / 2021-05-23 08:08:49 / B
2 / 2021-05-23 03:21:49 / B
1 / 2021-05-23 01:22:11 / C

原代码问题分析

  1. 遍历对象错误:for row in data遍历的是DataFrame的列名,而非行数据,导致逻辑完全偏离预期
  2. 整列赋值错误:直接执行data['count'] = ...会覆盖整列值,无法实现单行计数更新
  3. 分组逻辑缺失:未按「日期+class_id」维度分组,仅对比相邻行的class_id,忽略了日期边界
  4. 索引处理错误:初始index=-1,第一次循环时class_id[index-1]会取到最后一行数据,导致判断逻辑混乱

正确解决方案

利用Pandas的分组、排序和排名功能实现,避免低效且易出错的行循环:

from google.colab import drive
drive.mount('/content/gdrive')

import pandas as pd

# 读取数据:指定分隔符为' / ',保留timestamp为普通列(不设为索引)
data = pd.read_csv(
    'gdrive/My Drive/Colab_Notebooks/classproject/classdata.csv',
    parse_dates=['timestamp'],
    sep=' / '
)

# 提取timestamp的日期部分,作为分组依据
data['date'] = data['timestamp'].dt.date

# 按日期+class_id分组,每组内按timestamp降序生成计数
data['count'] = data.groupby(['date', 'class_id'])['timestamp'].rank(
    method='first', ascending=False
).astype(int)

# 调整列顺序并删除临时date列
data = data[['count', 'timestamp', 'class_id']]

# 查看结果
print(data)

代码说明

  • sep=' / ':匹配原始数据的分隔符,确保正确解析列
  • data['date'] = data['timestamp'].dt.date:提取日期维度,保证仅统计同一天内的同一类别
  • groupby(['date', 'class_id']):实现按日期+类别分组,精准限定统计范围
  • rank(method='first', ascending=False):在每组内按时间从晚到早排名,method='first'确保时间相同时按出现顺序分配唯一计数,最终转为整数类型

执行后即可得到与期望完全一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:50:11