Pandas新增列标记DataFrame中各文件每年首次出现的记录
实现方案
你之前的单字段分组只能统计全量数据下每个文件的首次出现,只要把年份维度加入分组键,就可以用Pandas原生groupby逻辑直接实现需求,完全不需要循环切分、拼接子表,性能和代码简洁度都会高很多。
具体实现代码
- 前置依赖和格式校验
首先确保时间列是标准datetime格式,如果已经做过类型转换可以跳过这步:
import pandas as pd import numpy as np df["Date/time"] = pd.to_datetime(df["Date/time"])
- 排序保证时序正确
先按文件、时间升序排列,保证每个文件的记录按发生时间从早到晚排列:
df = df.sort_values(["File", "Date/time"]).reset_index(drop=True)
- 双维度分组标记首次出现
分组键同时传入文件列、从时间列提取的年份列,组内做累计计数,计数为0的行就是当年该文件的第一条记录,标记为1,其余行留空:
# 定义分组键:文件 + 所属年份 group_cols = [df["File"], df["Date/time"].dt.year] # 组内累计计数,每组第一条记录计数为0 in_group_cumcount = df.groupby(group_cols).cumcount() # 生成目标列 df["First occurrence"] = np.where(in_group_cumcount == 0, 1, pd.NA)
原有循环方案问题说明
你写的循环拼接方案出现值覆盖,核心原因是循环内赋值的列名是First scan,和最终需要的First occurrence列名不统一,拼接时会出现列错位;而且循环切分子表再拼接的实现效率很低,数据量较大时性能差距会非常明显,不推荐使用。
运行上述代码后得到的结果和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者cording12
相关产品推荐
相关产品推荐

