在用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
显示结果为:
但实际要想的结果为:
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)
原始数据:
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
如果有帮助,望采纳