基于分组频率新增列及直接删除频率为1行的Pandas实现方案
解决方案
首先给出你的原始DataFrame:
import pandas as pd df = pd.DataFrame({ 'vehicle_id': [0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2], 'trip': [0,0,0,1,1,0,0,1,1,1,1,1,2,0,1,2] })
需求一:新增frequency列并删除频次为1的行
最优实现是用groupby+transform,高效给每个分组内的trip值计算频次并广播到每一行,再筛选掉频次等于1的行:
# 新增frequency列:按vehicle_id和trip分组,计算每组大小,用transform广播到每行 df['frequency'] = df.groupby(['vehicle_id', 'trip'])['trip'].transform('size') # 删除频次等于1的行 df_final = df[df['frequency'] != 1].reset_index(drop=True)
transform会保留原始DataFrame的索引结构,无需额外合并操作,效率拉满,适合处理大规模数据,运行后就能得到你要的中间结果和最终结果。
需求二:不新增列直接删除分组内频次为1的行
有两种简洁实现方式:
方法一:用transform直接筛选
# 计算每个(vehicle_id, trip)组的大小,直接保留大小>1的行 df_final = df[df.groupby(['vehicle_id', 'trip'])['trip'].transform('size') != 1].reset_index(drop=True)
方法二:用groupby的filter方法
# 按(vehicle_id, trip)分组,筛选出组内行数>1的所有行 df_final = df.groupby(['vehicle_id', 'trip']).filter(lambda x: len(x) > 1).reset_index(drop=True)
两种方法都能达成目标:transform方式性能更优,适合大数据量;filter代码可读性更强,逻辑更直观。
内容的提问来源于stack exchange,提问作者Mohammad.sh
相关产品推荐
相关产品推荐

