Pandas统计变量值概率并按组汇总的无循环优雅实现方案
实现代码
import pandas as pd # 此处省略你已有的DF生成逻辑 total_rows = len(DF) # 按group、names分组统计出现次数,计算对应概率 name_prob = DF.groupby(['group', 'names'], as_index=False).size() name_prob['prob'] = name_prob['size'] / total_rows # 透视转换为宽表,缺失name的概率填充为0 result = name_prob.pivot(index='group', columns='names', values='prob').fillna(0).reset_index() # 按要求重命名字段 result.columns = ['groups', 'P_n1', 'P_n2', 'P_n3', 'P_n4'] # 计算分组总概率 result['P_total'] = result[['P_n1', 'P_n2', 'P_n3', 'P_n4']].sum(axis=1) print(result)
输出结果示例
groups P_n1 P_n2 P_n3 P_n4 P_total 0 A1 0.142857 0.000000 0.428571 0.000000 0.571429 1 A2 0.142857 0.142857 0.000000 0.000000 0.285714 2 A3 0.000000 0.000000 0.000000 0.142857 0.142857
逻辑说明
全程使用pandas内置的分组、透视能力,没有自定义循环,逻辑清晰易维护:
- 每行数据对应一个types,每条数据的概率权重为
1/DF总行数,同一个name下的所有行概率相加就是该name的总概率 - 透视表自动对齐不同name列,缺失值填充0即可覆盖所有name字段
- 最后按行求和即可得到每个group的总概率
内容的提问来源于stack exchange,提问作者Geinkehdsk
相关产品推荐
相关产品推荐

