如何在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)组的记录数量,然后筛选掉符合删除条件的行。具体步骤如下:
- 计算每个组的记录数:用
groupby结合transform('size'),这样每一行都会带上所在组的总条数,方便后续逐行判断 - 定义筛选条件:保留组记录数≤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
相关产品推荐
相关产品推荐

