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

如何在Pandas Dataframe中实现带日期限制的去重累计计数?

统计过去720天内的活跃客户数

给定如下销售数据Dataframe:

data = {
    'client_id': ['01419', '1444', '346344', '83204', '8370660'],
    'order_date': ['2022-04-06', '2021-05-22', '2022-11-10', '2023-02-22', '2019-06-11'],
    'order_id': [200140, 146977, 249517, 260853, 91743],
    'name': ['TACIANA', 'ROSANA', 'MARIA', 'ERIVAL', 'JOAO']
}

需要新增一列active_base,对每一行统计当前订单日期过去720天内(含当天)有购买记录的、排除当前客户的去重客户ID数量,期望输出如下:

df2 = {
'client_id': ['01419', '1444', '346344', '83204', '8370660'],
'order_date': ['2022-04-06', '2021-05-22', '2022-11-10', '2023-02-22', '2019-06-11'],
'order_id': [200140, 146977, 249517, 260853, 91743],
'name': ['TACIANA', 'ROSANA', 'MARIA', 'ERIVAL', 'JOAO'],
'active_base': [1, 1, 2, 3, 0]
}

实现步骤

  1. 导入依赖并创建Dataframe
    导入pandas库,将原始数据转换为Dataframe:

    import pandas as pd
    
    data = {
        'client_id': ['01419', '1444', '346344', '83204', '8370660'],
        'order_date': ['2022-04-06', '2021-05-22', '2022-11-10', '2023-02-22', '2019-06-11'],
        'order_id': [200140, 146977, 249517, 260853, 91743],
        'name': ['TACIANA', 'ROSANA', 'MARIA', 'ERIVAL', 'JOAO']
    }
    df = pd.DataFrame(data)
    
  2. 转换日期类型
    将order_date列转换为datetime格式,方便后续时间范围计算:

    df['order_date'] = pd.to_datetime(df['order_date'])
    
  3. 定义计算函数并应用
    编写函数对每一行计算目标值,再通过apply方法批量处理:

    def calculate_active_base(row, df):
        # 计算时间范围:当前日期往前推720天至当前日期
        start_date = row['order_date'] - pd.Timedelta(days=720)
        end_date = row['order_date']
        # 筛选该时间范围内的所有订单
        date_mask = (df['order_date'] >= start_date) & (df['order_date'] <= end_date)
        # 获取范围内的去重客户ID
        unique_clients = df.loc[date_mask, 'client_id'].unique()
        # 计数:去重客户数减去当前客户(如果存在)
        active_count = len(unique_clients) - (1 if row['client_id'] in unique_clients else 0)
        return active_count
    
    # 新增active_base列
    df['active_base'] = df.apply(lambda x: calculate_active_base(x, df), axis=1)
    
  4. 查看结果
    执行代码后,df将包含新增列,输出结果与期望一致:

    print(df)
    

输出:

client_id order_date  order_id     name  active_base
0    01419 2022-04-06    200140  TACIANA            1
1     1444 2021-05-22    146977   ROSANA            1
2   346344 2022-11-10    249517    MARIA            2
3    83204 2023-02-22    260853   ERIVAL            3
4  8370660 2019-06-11     91743     JOAO            0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:07:09