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

求助:筛选近30天有活跃交易的用户最新交易数据

问题解决方案

原始交易数据

user_iddatetotal_transaction
1002222021-09-0110000
1003332021-09-0220000
1004442021-09-240
1004442021-09-2730000
1005552021-09-300
1006662021-09-30500

需求说明

需要筛选出近30天内有活跃交易的用户数据:

  • 活跃交易定义:total_transaction ≠ 0(非零交易)
  • 每个用户仅保留其最新的交易记录

尝试的代码(不符合预期)

df = df.groupby('user_id')['date','total_transaction'].max().reset_index()
df

问题:该代码会分别对date和total_transaction取最大值,可能导致日期与交易金额不对应同一条记录,同时未过滤掉total_transaction=0的无效数据。

预期输出

user_iddatetotal_transaction
1002222021-09-0110000
1003332021-09-0220000
1004442021-09-2730000
1006662021-09-30500

解决方案

步骤说明

  1. 转换date列为datetime类型,便于日期计算
  2. 过滤掉total_transaction=0的记录,同时筛选出近30天的数据(以数据中最晚日期为基准,也可替换为当前日期动态计算)
  3. 按用户分组,保留每个用户最新的交易记录

代码实现

import pandas as pd

# 1. 转换日期列类型
df['date'] = pd.to_datetime(df['date'])

# 2. 过滤条件:非零交易 + 近30天(以数据中最晚日期为基准)
latest_date = df['date'].max()
filtered_df = df[(df['total_transaction'] != 0) & (df['date'] >= latest_date - pd.Timedelta(days=30))]

# 3. 按用户分组,保留最新记录:先按日期降序排序,再去重保留每个用户第一条
result_df = filtered_df.sort_values(['user_id', 'date'], ascending=[True, False]) \
                       .drop_duplicates('user_id') \
                       .reset_index(drop=True)

# 可选:用groupby + idxmax的方式实现
# result_df = filtered_df.loc[filtered_df.groupby('user_id')['date'].idxmax()] \
#                        .reset_index(drop=True)

print(result_df)

代码解释

  • 日期转换:确保能进行日期加减等运算
  • 过滤逻辑:先剔除无效的零交易记录,再筛选出近30天范围内的有效数据
  • 去重逻辑:通过排序后保留每个用户的第一条记录(最新日期),或用idxmax直接定位每个用户最新日期的行索引,两种方式均可得到符合预期的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:40:33