计算dataframe中各business_id的FP=1数值占FP=0数值的百分比
按商家ID计算FP正负样本count比值实现
现有结构如下的DataFrame:
business_id FP count business_1 1 20 business_1 0 100 business_2 0 50
需求为对每个business_id,计算FP=1对应的count值除以同ID下FP=0对应的count值的比值,无对应样本时可根据需要设置默认值(示例中为避免除零错误返回0)。
方法1:分组自定义函数计算
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'business_id': ['business_1', 'business_1', 'business_2'], 'FP': [1, 0, 0], 'count': [20, 100, 50] }) # 单分组内计算比值的函数 def calc_ratio(group): cnt_fp1 = group[group['FP'] == 1]['count'].sum() cnt_fp0 = group[group['FP'] == 0]['count'].sum() return cnt_fp1 / cnt_fp0 if cnt_fp0 != 0 else 0 # 按business_id分组计算得到结果 res = df.groupby('business_id').apply(calc_ratio).reset_index(name='fp_1_0_ratio')
运行输出结果:
business_id fp_1_0_ratio 0 business_1 0.2 1 business_2 0.0
方法2:透视表实现(代码更简洁)
# 生成透视表,行为business_id,列是FP取值,值为count的求和结果 pivot_df = df.pivot_table(index='business_id', columns='FP', values='count', fill_value=0) # 直接计算比值,自动处理缺失的FP取值 pivot_df['fp_1_0_ratio'] = pivot_df.get(1, 0) / pivot_df.get(0, 0).replace(0, pd.NA) # 重置索引得到标准格式结果 res = pivot_df['fp_1_0_ratio'].reset_index()
该方法和方法1的输出结果完全一致。
内容的提问来源于stack exchange,提问作者Divya Khiani
相关产品推荐
相关产品推荐

