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

基于分组频率新增列及直接删除频率为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:45:35