求助:筛选近30天有活跃交易的用户最新交易数据
问题解决方案
原始交易数据
| user_id | date | total_transaction |
|---|---|---|
| 100222 | 2021-09-01 | 10000 |
| 100333 | 2021-09-02 | 20000 |
| 100444 | 2021-09-24 | 0 |
| 100444 | 2021-09-27 | 30000 |
| 100555 | 2021-09-30 | 0 |
| 100666 | 2021-09-30 | 500 |
需求说明
需要筛选出近30天内有活跃交易的用户数据:
- 活跃交易定义:
total_transaction ≠ 0(非零交易) - 每个用户仅保留其最新的交易记录
尝试的代码(不符合预期)
df = df.groupby('user_id')['date','total_transaction'].max().reset_index() df
问题:该代码会分别对date和total_transaction取最大值,可能导致日期与交易金额不对应同一条记录,同时未过滤掉total_transaction=0的无效数据。
预期输出
| user_id | date | total_transaction |
|---|---|---|
| 100222 | 2021-09-01 | 10000 |
| 100333 | 2021-09-02 | 20000 |
| 100444 | 2021-09-27 | 30000 |
| 100666 | 2021-09-30 | 500 |
解决方案
步骤说明
- 转换
date列为datetime类型,便于日期计算 - 过滤掉
total_transaction=0的记录,同时筛选出近30天的数据(以数据中最晚日期为基准,也可替换为当前日期动态计算) - 按用户分组,保留每个用户最新的交易记录
代码实现
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
相关产品推荐
相关产品推荐

