如何在Pandas DataFrame中高效获取同Customer_ID的下一条记录日期?
高效获取Pandas DataFrame中同客户的下一行日期
解决方案:分组+向量化移位操作
针对大数据集,彻底抛弃低效的逐行循环,用Pandas的groupby结合shift实现向量化计算,性能远优于循环方案。
步骤代码
- 先将日期列转为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'])
- 分组计算下一个日期:
# 按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
相关产品推荐
相关产品推荐

