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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:45:31