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
相关产品推荐
相关产品推荐

