如何按unique_id清理DataFrame:删除非空order_id后的空值行
基于unique_id清理DataFrame:删除非空order_id之后的空行
实现思路
对于每个unique_id,先找到该用户最晚出现非空order_id的日期,然后保留所有日期早于或等于该日期的行,即可过滤掉目标行。
代码实现
import pandas as pd # 构造原始数据 data = { 'date': ['2022-09-20', '2022-09-10', '2022-08-10', '2022-08-08', '2022-08-07', '2022-08-04', '2022-07-31', '2022-07-20'], 'unique_id': [111, 111, 111, 111, 111, 222, 222, 222], 'order_id': [None, None, '2660a139', None, None, None, 'e61d1e7d', None] } df = pd.DataFrame(data) # 1. 将日期列转为datetime类型,方便日期比较 df['date'] = pd.to_datetime(df['date']) # 2. 计算每个unique_id对应的最晚非空order_id日期 max_order_dates = df[df['order_id'].notna()].groupby('unique_id')['date'].max().reset_index() max_order_dates.columns = ['unique_id', 'max_order_date'] # 3. 合并原数据与最晚订单日期 df = df.merge(max_order_dates, on='unique_id') # 4. 过滤出符合条件的行,并删除辅助列 df_cleaned = df[df['date'] <= df['max_order_date']].drop('max_order_date', axis=1) # 5. 按用户和日期降序排序,匹配期望格式 df_cleaned = df_cleaned.sort_values(['unique_id', 'date'], ascending=[True, False]).reset_index(drop=True) print(df_cleaned)
输出结果
date unique_id order_id 0 2022-08-10 111 2660a139 1 2022-08-08 111 None 2 2022-08-07 111 None 3 2022-07-31 222 e61d1e7d 4 2022-07-20 222 None
内容的提问来源于stack exchange,提问作者tagilas
相关产品推荐
相关产品推荐

