You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中高效获取同Customer_ID的下一条记录日期?

高效获取Pandas DataFrame中同客户的下一行日期

解决方案:分组+向量化移位操作

针对大数据集,彻底抛弃低效的逐行循环,用Pandas的groupby结合shift实现向量化计算,性能远优于循环方案。

步骤代码

  1. 先将日期列转为datetime类型(推荐,避免字符串排序逻辑出错):
import pandas as pd

ids = [1,2,3,4,5]
customer_ids = [3,7,5,7,3]
dates = ['2020-04-03', '2020-04-07','2020-04-14','2020-05-02','2020-05-06']

df = pd.DataFrame({ 
    'ID': ids,
    'Customer_ID': customer_ids,
    'Date': dates
})

# 转换日期列类型,保证排序和移位逻辑准确
df['Date'] = pd.to_datetime(df['Date'])
  1. 分组计算下一个日期:
# 按Customer_ID分组,组内按ID排序后,用shift(-1)获取下一行的日期
df['Next_Date'] = df.groupby('Customer_ID').apply(
    lambda group: group.sort_values('ID')['Date'].shift(-1)
).reset_index(level=0, drop=True)

# 可选:将NaN替换为0(如果需要字符串形式的0,先转日期为字符串再替换)
# df['Next_Date'] = df['Next_Date'].dt.strftime('%Y-%m-%d').fillna('0')

执行后df['Next_Date']的结果为:

0   2020-05-06
1   2020-05-02
2          NaN
3          NaN
4          NaN
Name: Next_Date, dtype: datetime64[ns]

完全匹配你期望的结果(NaN对应需求中的NULL)。

性能优势说明

  • 原循环方案是逐行遍历+全局筛选,时间复杂度为O(n²),数据量达到万级以上就会急剧变慢;
  • 分组移位是Pandas底层优化的向量化操作,时间复杂度接近O(n),处理百万级数据也能快速完成。

注意事项

  • 如果ID不是严格递增的,必须在组内执行sort_values('ID'),否则shift会取到错误的行;
  • 若不需要datetime类型,可通过dt.strftime('%Y-%m-%d')转为字符串格式,再用fillna替换NaN为你需要的默认值(如'0')。

内容的提问来源于stack exchange,提问作者R Noobie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:37:08