如何用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__
相关产品推荐
相关产品推荐

