如何在Pandas DataFrame中按客户获取Y的首次出现日期?
问题:为每个客户标记
Y/N列中Y的首次出现日期 用户拥有如下Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'BAS_DT': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-02', '2023-01-03'], 'CUS_NAME': ['A', 'A', 'A', 'B', 'B'], 'Y/N': ['Y', 'Y', 'Y', 'N', 'Y'], 'cum_count': [1, 2, 3, 1, 2]})
原始数据展示:
BAS_DT CUS_NAME Y/N cum_count 0 2023-01-02 A Y 1 1 2023-01-03 A Y 2 2 2023-01-04 A Y 3 3 2023-01-02 B N 1 4 2023-01-03 B Y 2
期望实现的效果:为每个CUS_NAME找到Y/N列中Y的首次出现日期,仅在该首次出现的行填充对应日期,其余行填充NaN,最终输出如下:
df2 = pd.DataFrame({'BAS_DT': ['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-02', '2023-01-03'], 'CUS_NAME': ['A', 'A', 'A', 'B', 'B'], 'Y/N': ['Y', 'Y', 'Y', 'N', 'Y'], 'cum_count': [1, 2, 3, 1, 2], 'occur_date': ['2023-01-02', np.nan, np.nan, np.nan, '2023-01-03']})
期望输出展示:
BAS_DT CUS_NAME Y/N cum_count occur_date 0 2023-01-02 A Y 1 2023-01-02 1 2023-01-03 A Y 2 NaN 2 2023-01-04 A Y 3 NaN 3 2023-01-02 B N 1 NaN 4 2023-01-03 B Y 2 2023-01-03
解决方案
通过分组筛选+合并+条件赋值的方式实现,步骤清晰易理解:
import pandas as pd import numpy as np # 1. 提取每个客户首次出现Y的日期 first_y_dates = df[df['Y/N'] == 'Y'].groupby('CUS_NAME')['BAS_DT'].first().reset_index(name='occur_date') # 2. 将日期合并回原DataFrame,让每行都对应客户的首次Y日期 df = df.merge(first_y_dates, on='CUS_NAME', how='left') # 3. 仅保留首次出现Y的行的日期,其余行设为NaN df['occur_date'] = np.where( (df['Y/N'] == 'Y') & (df.groupby('CUS_NAME').cumcount() == 0), df['occur_date'], np.nan ) print(df)
代码逻辑说明
- 第一步:先筛选出所有
Y/N为Y的行,再按CUS_NAME分组,取每组的第一个BAS_DT,得到每个客户首次出现Y的日期。 - 第二步:通过
merge将这些日期关联到原表的每一行,确保每个客户的所有行都能获取到对应的首次Y日期。 - 第三步:通过
np.where做条件判断:仅当当前行是该客户第一个Y行时,保留日期,其他情况(非Y行、同客户后续的Y行)都设为NaN,完全匹配需求。
内容的提问来源于stack exchange,提问作者hoa tran
相关产品推荐
相关产品推荐

