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

如何移除DataFrame中组内最小值不低于阈值的分组?

问题分析与解决方法

原数据

id1  id2  value
1    1    35
1    1    23
1    1    20
1    2    5
1    2    50
2    1    42
2    1    3
2    1    12
2    2    64
2    3    34
2    3    1

需求

按id1和id2分组,移除所有组内最小值≥10的分组,保留剩余行。

预期结果

id1  id2  value
1    2    5
1    2    50
2    1    3
2    1    12
2    3    34
2    3    1

错误代码与问题分析

用户尝试的代码:

dfmin = df.groupby(["id1", "id2"])["value"].min().reset_index()

df = df[
    dfmin.loc[
        (dfmin["id1"] == df["id1"]) & (dfmin["id1"] == df["id1"]),
        "value",
    ].iat[0]
    < 10
]

抛出错误:Can only compare identically-labeled Series objects

问题点:

  • 笔误:第二个判断条件错误写成了dfmin["id1"] == df["id1"],应为dfmin["id2"] == df["id2"]。
  • 核心逻辑错误:dfmin是分组聚合后的结果(仅5行),和原df(11行)的Series长度、索引都不匹配,直接做相等比较会触发维度不匹配的错误;同时.iat[0]只会取第一个匹配值,无法对应到原df每行所属的分组判断。

最优解决方法

方法一:用transform直接生成组内最小值(最直观)

通过transform方法,为原DataFrame的每行生成其所属分组的最小值,再直接筛选:

# 生成每行对应的组内最小值
df['group_min'] = df.groupby(['id1', 'id2'])['value'].transform('min')
# 筛选组内最小值小于10的行,最后删除临时列
df = df[df['group_min'] < 10].drop('group_min', axis=1)

方法二:先筛选有效分组再过滤(内存更友好)

先提取符合条件的分组键,再用索引匹配过滤原数据:

# 获取组内最小值小于10的(id1, id2)组合
valid_groups = df.groupby(['id1', 'id2'])['value'].min().loc[lambda x: x < 10].index
# 过滤原数据
df = df[df.set_index(['id1', 'id2']).index.isin(valid_groups)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:40:29