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

Pandas按组统计各列中大于指定值的元素数量

解决按组统计DataFrame列中大于对应阈值的元素数量问题

嘿,这个需求其实用Pandas的groupby结合自定义函数就能轻松实现,我来给你一步步拆解:

首先,先把你给出的示例数据用代码还原出来,方便验证:

import pandas as pd

# 示例DataFrame df
df = pd.DataFrame({
    'item': ['a','a','a','b','b','b','c','c','d','d'],
    'A': [-4,19,-18,-2,-9,-20,-19,11,5,7],
    'B': [17,-16,-11,9,-15,2,0,3,0,1],
    'C': [-15,-3,-13,7,-14,-10,-10,4,-17,-1]
})

# 条件DataFrame c
c = pd.DataFrame({
    'item': ['a','b','c','d'],
    'value': [5,-1,2,1]
})

接下来,我们需要把条件表c转换成一个以item为键、阈值为值的字典,这样每个分组能快速获取对应的阈值:

# 构建阈值字典
threshold_map = c.set_index('item')['value'].to_dict()

然后,定义一个自定义函数,用来处理每个分组:这个函数会拿到当前分组的DataFrame,根据分组名称(也就是item的值)获取对应的阈值,然后统计分组中A、B、C列里大于该阈值的元素数量:

def count_above(group):
    # 获取当前分组的阈值
    thresh = threshold_map[group.name]
    # 对A/B/C列做大于阈值的判断,然后求和(True会被视为1)
    return (group[['A', 'B', 'C']] > thresh).sum()

最后,用groupby按item分组,再应用这个函数就能得到你想要的结果:

result = df.groupby('item').apply(count_above)
# 调整格式匹配期望输出
result = result.rename_axis('item').reset_index()
print(result)

运行后输出的结果就和你期望的完全一致:

item  A  B  C
0    a  1  1  0
1    b  0  2  1
2    c  1  1  1
3    d  2  0  0

简单解释下核心逻辑:

  • group.name就是当前分组的item值,比如处理a组时,group.name就是'a',能直接从字典里拿到阈值5
  • group[['A','B','C']] > thresh会生成一个布尔值的DataFrame,每个元素表示是否大于阈值
  • sum()方法会对每列的布尔值求和,True对应1,False对应0,正好就是我们要统计的数量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:43