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

如何用Pandas DataFrame按列分组计算满足指定条件的行占比?

Pandas实现分组计算满足条件行占比的惯用方法

嘿,这个需求在Pandas里有几种非常简洁的实现方式,刚好对应你SQL里的逻辑,我给你梳理几个最常用的:

方法1:利用布尔值的均值特性(最简洁)

在Pandas里,布尔值True会被视为1,False视为0,所以对布尔数组取均值直接就是满足条件的行占比。结合groupby可以一步到位:

# 直接计算每组中col2等于'foo'的占比
result = df.groupby('col1')['col2'].apply(lambda x: (x == 'foo').mean()).reset_index(name='ratio')

或者拆分步骤,可读性更好一点:

# 先创建一个布尔列标记是否满足条件
df['is_foo'] = df['col2'] == 'foo'
# 分组后对布尔列取均值得到占比
result = df.groupby('col1')['is_foo'].mean().reset_index(name='ratio')

方法2:显式聚合计数后计算(更直观)

如果你想更清晰地看到中间的计数过程,可以分别统计满足条件的行数和每组总行数,再做除法,和你SQL的逻辑完全对应:

# 分组聚合得到两个计数列
agg_df = df.groupby('col1')['col2'].agg(
    foo_count=lambda x: (x == 'foo').sum(),  # 满足条件的行数
    total_count='count'                     # 每组总行数
)
# 计算占比并整理结果
result = agg_df.assign(ratio=agg_df['foo_count'] / agg_df['total_count']).reset_index()
# 可选:移除中间计数列
result = result.drop(columns=['foo_count', 'total_count'])

示例演示

用一个小数据集来验证效果:

import pandas as pd

# 构造测试数据
df = pd.DataFrame({
    'col1': ['A', 'A', 'B', 'B', 'B', 'C'],
    'col2': ['foo', 'bar', 'foo', 'foo', 'bar', 'bar']
})

# 用方法1计算
result = df.groupby('col1')['col2'].apply(lambda x: (x == 'foo').mean()).reset_index(name='ratio')
print(result)

输出结果:

col1     ratio
0    A  0.500000
1    B  0.666667
2    C  0.000000

这和你用SQL查询得到的结果完全一致~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 09:22:43