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

如何在Pandas中使用Group By构建过滤条件,移除指定数据行

解决DataFrame中移除特定条件行的问题

我来帮你实现这个需求,咱们一步一步来:

首先,先把你给的示例数据转换成可复用的Pandas DataFrame,方便测试:

import pandas as pd

data = {
    'id': [1, 1, 1, 2, 2, 3],
    'finalid': [1, 2, 32, 2, 23, 3],
    'month': [1, 1, 1, 1, 1, 1],
    'year': [2012, 2012, 2012, 2012, 2012, 2012],
    'count_ph': [12, 6, 6, 2, 2, 2],
    'count_sh': [20, 18, 2, 6, 6, 2]
}
df_target = pd.DataFrame(data)

接下来,按照你的需求逻辑,我们需要先标记出每个(id, month, year)组的记录数量,然后筛选掉符合删除条件的行。具体步骤如下:

  1. 计算每个组的记录数:用groupby结合transform('size'),这样每一行都会带上所在组的总条数,方便后续逐行判断
  2. 定义筛选条件:保留组记录数≤1 或者 id≠finalid 的行(因为要删除的是组记录数>1且id==finalid的行,取反就是保留规则)

实现代码如下:

# 计算每个(id, month, year)组的记录数,添加到新列group_size
df_target['group_size'] = df_target.groupby(['id', 'month', 'year'])['id'].transform('size')

# 筛选出需要保留的行
filtered_df = df_target[~((df_target['group_size'] > 1) & (df_target['id'] == df_target['finalid']))]

# 去掉临时的group_size列,还原成原始列结构
filtered_df = filtered_df.drop(columns=['group_size'])

运行这段代码后,filtered_df就是你期望的结果:

id  finalid  month  year  count_ph  count_sh
1   1        2      1  2012         6        18
2   1       32      1  2012         6         2
4   2       23      1  2012         2         6
5   3        3      1  2012         2         2

解释一下逻辑:

  • 对于id=1的组,有3条记录(group_size=3>1),其中id==finalid的是第一条,所以这条被移除,剩下两条保留
  • 对于id=2的组,有2条记录(group_size=2>1),其中id==finalid的是第四条,所以这条被移除,剩下第五条保留
  • 对于id=3的组,只有1条记录(group_size=1),虽然id==finalid,但不满足组记录数>1的条件,所以保留

这样就完全符合你的需求啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:11:51