如何在按日期排序的Pandas DataFrame中标记列元素首次出现记录
标记Pandas DataFrame中分组首次出现的记录
问题描述
现有一个按Date字段降序排序的Pandas DataFrame,数据定义及展示如下:
原始DataFrame代码
import pandas as pd df = pd.DataFrame({"Date":['2023-02-11','2023-02-10','2023-02-09','2023-02-08','2023-02-07','2023-02-06','2023-02-05'], "A":['a','a','c','a','c','b','b'], "B":[1,2,3,4,5,6,7]})
原始数据展示
Date A B 2023-02-11 a 1 2023-02-10 a 2 2023-02-09 c 3 2023-02-08 a 4 2023-02-07 c 5 2023-02-06 b 6 2023-02-05 b 7
需要新增一列FirstTime:当该行是A列对应符号**首次出现(即最早日期)**的记录时,值为1,否则为0。期望输出如下:
Date A B FirstTime 2023-02-11 a 1 0 2023-02-10 a 2 0 2023-02-09 c 3 0 2023-02-08 a 4 1 2023-02-07 c 5 1 2023-02-06 b 6 0 2023-02-05 b 7 1
解决方案
由于DataFrame按Date降序排列,每个A分组的最后一行即为该符号首次出现的记录,以下两种方法均可实现需求:
方法一:分组定位最后一行标记
# 初始化新列为0 df['FirstTime'] = 0 # 获取每个A分组最后一行的索引 first_rows_idx = df.groupby('A').tail(1).index # 给对应行赋值1 df.loc[first_rows_idx, 'FirstTime'] = 1
方法二:反向累计计数判断
利用cumcount反向计数,判断是否为分组内的最后一行:
# 按A分组反向累计计数,计数为0的行即为首次出现的记录,转成int类型 df['FirstTime'] = df.groupby('A').cumcount(ascending=False).eq(0).astype(int)
内容的提问来源于stack exchange,提问作者Ishigami
相关产品推荐
相关产品推荐

