如何用Pandas按用户分组处理日期,确保起始不早于2023年1月1日
处理用户日期数据:强制最早日期不早于2023年1月1日
需求说明
需要对用户的日期数据按以下规则处理:
- 若用户已有
2023年1月1日的数据,保留该行及之后的所有行,删除该日期之前的行; - 若用户没有
2023年1月1日的数据,但存在早于该日期的行,将用户最早的那一行日期修改为2023年1月1日,保留其他行; - 若用户所有行的日期都晚于
2023年1月1日,直接保留原数据。
源数据
| USER | Date | Value |
|---|---|---|
| USER1 | 01/06/2022 | 1000 |
| USER1 | 01/01/2023 | 1000 |
| USER1 | 01/02/2023 | 1200 |
| USER1 | 02/02/2023 | 1300 |
| USER2 | 01/06/2021 | 1000 |
| USER2 | 01/02/2023 | 1200 |
| USER2 | 02/02/2023 | 1250 |
| USER3 | 02/06/2023 | 1250 |
数据初始化代码
import pandas as pd df = pd.DataFrame({ "USER": ['USER1', 'USER1', 'USER1', 'USER1', 'USER2', 'USER2', 'USER2', 'USER3'], "Date": ['01/06/2022', '01/01/2023', '01/02/2023', '02/02/2023', '01/06/2021', '01/02/2023', '02/02/2023', '02/06/2023'], "Value": ['1000', '1000', '1200', '1300', '1000', '1200', '1250', '1250'], })
解决方案代码
# 转换日期列为datetime类型,适配原数据的MM/DD/YYYY格式 df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y') target_date = pd.to_datetime('2023-01-01') def process_group(group): # 筛选出日期不晚于目标日期的行 filtered = group[group['Date'] >= target_date] if filtered.empty: # 所有行都早于目标日期,修改第一行的日期 modified_first = group.iloc[[0]].copy() modified_first['Date'] = target_date # 合并修改后的第一行与剩余行 return pd.concat([modified_first, group.iloc[1:]]) else: # 存在符合要求的行,直接保留筛选结果 return filtered # 按用户分组处理后合并结果 result_df = df.groupby('USER', group_keys=False).apply(process_group) # 将日期转回原格式,重置索引 result_df['Date'] = result_df['Date'].dt.strftime('%m/%d/%Y') result_df = result_df.reset_index(drop=True)
处理后结果
| USER | Date | Value | 说明 |
|---|---|---|---|
| USER1 | 01/01/2023 | 1000 | 保留该行,删除之前的行 |
| USER1 | 01/02/2023 | 1200 | |
| USER1 | 02/02/2023 | 1300 | |
| USER2 | 01/01/2023 | 1000 | 将原2021年6月1日的日期改为2023年1月1日 |
| USER2 | 01/02/2023 | 1200 | |
| USER2 | 02/02/2023 | 1250 | |
| USER3 | 02/06/2023 | 1250 | 保留原数据,日期晚于2023年1月1日 |
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

