如何在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
原代码问题分析
- 遍历对象错误:
for row in data遍历的是DataFrame的列名,而非行数据,导致逻辑完全偏离预期 - 整列赋值错误:直接执行
data['count'] = ...会覆盖整列值,无法实现单行计数更新 - 分组逻辑缺失:未按「日期+class_id」维度分组,仅对比相邻行的class_id,忽略了日期边界
- 索引处理错误:初始
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
相关产品推荐
相关产品推荐

