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

Pandas优化:高效计算客户在账天数(2600万行数据场景)

高效计算客户在账天数的解决方案

嘿,我完全懂你处理2600万行数据时的崩溃——逐个客户循环处理的方式在小数据集上没问题,但面对千万级规模时,效率低到难以接受。咱们直接上向量化的分组解决方案,这可是pandas处理大规模数据的核心优势!

问题根源

你之前的方法需要遍历每个唯一客户,每次都要切片、排序、计算,这属于Python层面的循环操作,时间复杂度是O(n*k)(n是行数,k是客户数),对千万级数据来说完全不适用。而pandas的groupby+transform是基于底层优化的向量化操作,能把时间复杂度降到O(n)级别。

高效实现代码

首先确保你的Report Date列是datetime类型(如果还不是的话先转换):

import pandas as pd

# 转换日期列(如果未转换)
df['Report Date'] = pd.to_datetime(df['Report Date'])

然后用分组+transform一次性计算所有客户的在账天数:

# 按客户编号分组,计算每个客户的首次与末次报告日的天数差,并广播到每一行
df['Age in Days'] = df.groupby('Customer No')['Report Date'].transform(
    lambda x: (x.max() - x.min()).days
)

为什么这个方法快?

  • groupby是pandas底层优化过的操作,用C语言实现,比Python循环快几个数量级
  • transform会把分组计算的结果自动匹配回原DataFrame的每一行,不用手动处理列表扩展和赋值
  • 不管你的数据有没有排序,x.max()和x.min()都能准确获取每个客户的末次和首次报告日,无需额外排序操作

验证示例数据

用你给出的示例数据测试,这个代码会输出和你示例完全一致的Age in Days列:

  • 客户1:首次2018-08-14,末次2018-08-15 → 差1天
  • 客户2:首次2018-08-14,末次2018-08-16 → 差2天
  • 客户3:首次和末次都是2018-08-16 → 差0天

额外优化建议

如果你的数据已经按Customer No和Report Date排好序了,也可以用x.iloc[0]和x.iloc[-1]代替min()和max(),性能会再提升一点点:

df['Age in Days'] = df.groupby('Customer No')['Report Date'].transform(
    lambda x: (x.iloc[-1] - x.iloc[0]).days
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:29:52