如何按门店提取最近及次近DateTime,生成含NaN的新df
解决方案
你可以用pandas的分组(groupby)结合聚合方法来实现,步骤如下:
- 先确保「Date Time」列是datetime格式(避免字符串排序出错):
import pandas as pd # 原始数据 data = { 'Store': [100, 100, 100, 101, 102], 'Date Time': ['2022-03-24 19:04:00', '2022-05-05 10:29:00', '2022-07-29 11:58:00', '2022-03-15 08:56:00', '2022-04-15 10:21:00'] } df = pd.DataFrame(data) # 转换日期格式 df['Date Time'] = pd.to_datetime(df['Date Time'])
- 按「Store」分组,分别提取每组的最近访问日期(最后一条记录)和次近访问日期(倒数第二条记录,没有则返回NaN):
# 分组聚合 result_df = df.groupby('Store')['Date Time'].agg( Most_Recent_Visit_Date='last', Previous_Visit_Date=lambda x: x.nth(-2) if len(x)>=2 else pd.NA ).reset_index() # 调整列顺序(和目标df一致) result_df = result_df[['Store', 'Previous_Visit_Date', 'Most_Recent_Visit_Date']]
- 运行后得到的
result_df就是你要的目标格式:
| Store | Previous_Visit_Date | Most_Recent_Visit_Date |
|---|---|---|
| 100 | 2022-05-05 10:29:00 | 2022-07-29 11:58:00 |
| 101 | NaN | 2022-03-15 08:56:00 |
| 102 | NaN | 2022-04-15 10:21:00 |
补充说明
- 用
groupby分组后,last()直接取每组排序后的最后一条(也就是最新日期); lambda x: x.nth(-2) if len(x)>=2 else pd.NA用来判断组内记录数,有2条及以上就取倒数第二条,否则返回空值;- 如果你已经提前按「Store」和「Date Time」排过序,那这个方法直接生效,不需要额外排序,因为
groupby会保留原组内的顺序,或者你也可以在分组时先排序:df.sort_values(['Store', 'Date Time']).groupby('Store')['Date Time']...
内容的提问来源于stack exchange,提问作者Zane
相关产品推荐
相关产品推荐

