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',能直接从字典里拿到阈值5group[['A','B','C']] > thresh会生成一个布尔值的DataFrame,每个元素表示是否大于阈值sum()方法会对每列的布尔值求和,True对应1,False对应0,正好就是我们要统计的数量
内容的提问来源于stack exchange,提问作者Huan
相关产品推荐
相关产品推荐

