m0_75261922 2022-12-04 23:01 采纳率: 75%
浏览 91
已结题

python 分组计算百分比问题

在用pd.pivot_table处理完原始表格后,想实现df.groupby函数的分组内百分比计算遇到难题。

df = pd.read_excel("测试1 - 副本.xlsx")
df=pd.DataFrame(df)
s1=df.groupby(["业务员ID","险种","是否续保","保费"]).aggregate({"保费":np.sum})
ds=s1.groupby(level="保费").apply(lambda x: x*100/float(x.sum()))
ds

显示结果为:

img

但实际要想的结果为:

img

  • 写回答

5条回答 默认 最新

  • Java大魔王 2022-12-05 08:58
    关注
    
    import pandas as pd
    
    if __name__ == '__main__':
        df = pd.DataFrame([{"业务员ID": "A", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 8867.93, "件数": 4},
                           {"业务员ID": "A", "险种": "安全生产责任保险(B)", "是否续保": "是", "保费": 1067.93, "件数": 8},
                           {"业务员ID": "B", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 2547.17, "件数": 6},
                           {"业务员ID": "B", "险种": "安全生产责任保险(B)", "是否续保": "是", "保费": 9865.17, "件数": 3},
                           {"业务员ID": "C", "险种": "食品安全责任保险", "是否续保": "是", "保费": 2377.36, "件数": 8},
                           {"业务员ID": "D", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 2452.84, "件数": 20},
                           {"业务员ID": "E", "险种": "个人责任保险", "是否续保": "否", "保费": 118.68, "件数": 1},
                           {"业务员ID": "F", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 52641.54, "件数": 2},
                           {"业务员ID": "G", "险种": "个人责任保险", "是否续保": "否", "保费": 26.22, "件数": 9}])
        result = []
        for key, itemGroup in df.groupby(['业务员ID', '险种']):
            feeTotal = itemGroup['保费'].sum()
            numTotal = itemGroup['件数'].sum()
            itemGroup['业务员ID'] = key[0]
            itemGroup['险种'] = key[1]
            itemGroup['保费占比'] = round(100 * itemGroup['保费'] / feeTotal, 2).apply(lambda x: str(x) + "%")
            itemGroup['件数占比'] = round(100 * itemGroup['件数'] / numTotal, 2).apply(lambda x: str(x) + "%")
            result.append(itemGroup)
        resultDf = pd.concat(result)
        print(resultDf)
    

    原始数据:

    img


    结果:

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 12月13日
  • 已采纳回答 12月5日
  • 修改了问题 12月4日
  • 创建了问题 12月4日