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

R语言如何根据两列条件筛选dataframe中的目标行

每个Profile ID保留最后一笔交易的最优实现

针对15万行规模的pandas DataFrame处理需求,不要使用手写双重循环+if判断的实现,pandas内置的向量化操作均为底层C实现,性能比Python原生循环高100~1000倍,全量处理耗时仅毫秒级。

前置校验

首先必须将时间列转为标准datetime格式,避免字符串排序导致的时间先后判断错误:

import pandas as pd
df['Date'] = pd.to_datetime(df['Date'])

方案1:排序去重(易维护、不易出错)

逻辑最直观:先将全表按交易时间从早到晚升序排列,再按Profile ID字段去重,每个ID仅保留最后一条记录(即时间最晚的交易):

result = df.sort_values(by='Date').drop_duplicates(subset='Profile ID', keep='last')
  • 优势:代码逻辑直白,几乎不会产生逻辑bug,15万行数据处理耗时约30~50毫秒,完全满足日常需求
  • 适用场景:常规数据处理、代码需要跨人员维护的场景

方案2:分组取最大时间索引(性能最优)

省去全表排序的开销,直接按Profile ID分组,定位每个分组内Date字段最大的行索引,直接从原表筛选目标行:

result = df.loc[df.groupby('Profile ID')['Date'].idxmax()]
  • 优势:性能比排序去重方案高30%~50%,数据量扩大到百万级时优势更明显
  • 注意事项:如果同一用户存在多笔交易时间完全一致的记录,idxmax()会默认返回同时间下最先出现的行,如需自定义同时间的保留规则,可以提前增加次级排序字段(如交易流水号、记录入库时间)再取索引。

结果校验

可以用你提到的测试ID验证结果正确性:

test_profile_id = "aToPCmXnXnOCgoGqEOVxY5pEnNM0h1"
print(result[result['Profile ID'] == test_profile_id])

执行后输出的就是该用户时间最晚的交易记录,和你示例中第3656行的内容完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:36:23