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


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

import pandas as pd

if __name__ == '__main__':
    df = pd.DataFrame([{"业务员ID": "A", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 8867.93},
                       {"业务员ID": "B", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 2547.17},
                       {"业务员ID": "B", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 2547.17},
                       {"业务员ID": "C", "险种": "食品安全责任保险", "是否续保": "是", "保费": 2377.36},
                       {"业务员ID": "D", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 2452.84},
                       {"业务员ID": "E", "险种": "个人责任保险", "是否续保": "否", "保费": 118.68},
                       {"业务员ID": "F", "险种": "安全生产责任保险(B)", "是否续保": "否", "保费": 52641.54},
                       {"业务员ID": "G", "险种": "个人责任保险", "是否续保": "否", "保费": 26.22}])
    df = df.groupby(["业务员ID", "险种", "是否续保"]).agg({"保费": 'sum'}).reset_index()
    df['保费率'] = df['保费'] / df['保费'].sum()
    print(df)

参考一下

代码和测试样例如下:


# 代码
import pandas as pd

df = pd.read_excel(r"a.xlsx")
pd.DataFrame(df)
s1 = df.groupby(["业务员ID", "险种", '是否续保'])[['保费', '件数']].transform(lambda x: x.sum()) / df.groupby(
    ["业务员ID", "险种"])[['保费', '件数']].transform(lambda x: x.sum())

df['保费占比'] = s1['保费'].apply(lambda x: format(x, '.2%'))
df['件数占比'] = s1['件数'].apply(lambda x: format(x, '.2%'))

print(df)

"""
a.xlsx 测试数据:
业务员ID    险种    是否续保    保费    件数
1    a    是    5    1
1    a    否    3    1

输出df结果样例:
   业务员ID 险种 是否续保  保费  件数    保费占比    件数占比
0      1  a    是   5   1  62.50%  50.00%
1      1  a    否   3   1  37.50%  50.00%
"""

Python: 计算百分比
https://blog.csdn.net/qq_21264377/article/details/124071386
如果有帮助,望采纳