如何基于条件筛选并剔除重复行?Pandas百万级AMS卡号数据集去重优化问询
优化Pandas百万级数据去重与聚合的高效方案
兄弟,你用Python循环遍历每个AMS卡号的方式,在百万级数据下肯定慢得离谱!Pandas的强项就是批量矢量操作,Python层面的for循环完全没利用到它的底层优化,而且你还反复切片数据框、用append(这个操作每次都要复制整个数据,巨耗内存),不慢才怪。
给你两套高效的实现方案,都是用Pandas内置的分组聚合功能,速度能提升几十甚至上百倍:
方案一:分组聚合+关联筛选
先一次性计算每个AMS卡号对应的目标日期,再和原数据匹配筛选:
import pandas as pd # 先确保日期列是datetime类型(如果还没转的话) df['Customer Reg Date'] = pd.to_datetime(df['Customer Reg Date']) df['Customer First Purchase Date'] = pd.to_datetime(df['Customer First Purchase Date']) # 按AMS卡号分组,计算每个卡号的最新注册日期、最早首次购买日期 aggregated = df.groupby('AMS Card').agg( latest_reg=('Customer Reg Date', 'max'), earliest_pur=('Customer First Purchase Date', 'min') ).reset_index() # 关联原数据,筛选出符合条件的行,最后去重确保卡号唯一 dffinal = df.merge(aggregated, on='AMS Card') dffinal = dffinal[ (dffinal['Customer Reg Date'] == dffinal['latest_reg']) & (dffinal['Customer First Purchase Date'] == dffinal['earliest_pur']) ].drop(columns=['latest_reg', 'earliest_pur']).drop_duplicates(subset='AMS Card')
方案二:transform原地添加聚合列(更简洁)
用transform直接在原数据上添加分组后的聚合结果,再筛选:
import pandas as pd # 先转日期类型 df['Customer Reg Date'] = pd.to_datetime(df['Customer Reg Date']) df['Customer First Purchase Date'] = pd.to_datetime(df['Customer First Purchase Date']) # 给每行添加对应卡号的最大注册日期、最小购买日期 df['latest_reg'] = df.groupby('AMS Card')['Customer Reg Date'].transform('max') df['earliest_pur'] = df.groupby('AMS Card')['Customer First Purchase Date'].transform('min') # 筛选符合条件的行,清理临时列后去重 dffinal = df[ (df['Customer Reg Date'] == df['latest_reg']) & (df['Customer First Purchase Date'] == df['earliest_pur']) ].drop(columns=['latest_reg', 'earliest_pur']).drop_duplicates(subset='AMS Card')
为什么这两种方法快?
groupby是Pandas底层用C实现的批量操作,比Python循环效率高N个量级,百万级数据秒级就能处理完- 避免了反复创建小数据框和
append的内存开销,所有操作都是基于原数据的批量处理 - 最后用
drop_duplicates(subset='AMS Card')兜底,确保同一卡号只留一条记录(如果有多个行同时满足日期条件的话)
内容的提问来源于stack exchange,提问作者NathanLite
相关产品推荐
相关产品推荐

