pandas中的groupby使用方法及案例分析

GroupBy():

官网地址:https://pandas.pydata.org/docs/reference/groupby.html

pandas中对数据进行分组操作的方法,官方有很详细的教程。下面的案例是真实遇到的问题,看一看用pandas是如何解决的。

构造数据:

import pandas as pd
import numpy as np
df = pd.DataFrame(data={
    "boss":["A"]*3+["B"]*3+["C"]*4,
    "owner":["A1","A1","A2","B1","B2","B2","C1","C1","C2","C2"],
    "month":[1,2,1,1,1,2,1,2,1,2],
    "fk_money":[10,20,30,40,50,60,70,80,90,100],
})

数据展示:

bossownermonthfk_money
0AA1110
1AA1220
2AA2130
3BB1140
4BB2150
5BB2260
6CC1170
7CC1280
8CC2190
9CC22100
数据解释:比如第一条数据,老板A手下的业务员A1,在第1个月的放款金额为10万。

问题一:老板手下的业务员在那个月的放款金额最多?

解决方法:

  • 按照owner分组,对fk_money降序排列,取第一个数据
result1_df = df.sort_values(by="fk_money",ascending=False).groupby(by="owner").head(1)
result1_df
bossownermonthfk_money
9CC22100
7CC1280
5BB2260
3BB1140
2AA2130
1AA1220
解释:老板C手下的业务员C2在第2个月的放款金额最大为100万。
拓展:如何取第二大的数据?
  • GroupBy.nth(),取每一组第n行的数据,n从0开始,0代表第一行。
  • 没有第n行的时候,不取。
result1_df = df.sort_values(by="fk_money",ascending=False).groupby(by="owner",as_index=False).nth(1)
result1_df
ownerbossmonthfk_money
A1A110
B2B150
C1C170
C2C190

解释:老板A手下的A1,所有放款金额中,放款金额第二多的月份是在第一个月。

问题二:业务员每个月的放款金额占比情况?

解决方案:

  1. 计算出每个业务员总的放款金额owner_total_fk_money
  2. 将df与计算好的owner_total_fk_money合并
  3. fk_money除以owner_total_fk_money得到需要的数据
### 代码实现:
owner_total_fk_money = df.groupby(by="owner",as_index=False).agg({"fk_money":"sum"})
result1_df = pd.merge(df,owner_total_fk_money,on="owner",how="left",suffixes=("","_total"))
result1_df["rate"] = (result1_df["fk_money"]/result1_df["fk_money_total"]).map(lambda x:"{:.2%}".format(x))
result1_df
bossownermonthfk_moneyfk_money_totalrate
0AA11103033.33%
1AA12203066.67%
2AA213030100.00%
3BB114040100.00%
4BB215011045.45%
5BB226011054.55%
6CC117015046.67%
7CC128015053.33%
8CC219019047.37%
9CC2210019052.63%
解释:A1业务员在第一个月放款10万,占其总放款(30万)比例为33.33%,第二个月放款20万,占比为66.67%

问题三:每个老板手下业务员放款占比?

解决思路:

  1. 需要知道每个老板总的放款金额,boss_df
  2. 需要知道每个业务员的放款金额,owner_df
  3. 按照boss字段合并boss_df和owner_df
  4. 业务员的放款金额除以每个老板总的放款金额
# 计算每一个boss的总fk_money
boss_df = df.groupby(by="boss",as_index=False).agg({"fk_money":"sum"})
# 计算每一个owner的总fk_money
owner_df = df.groupby(by=["boss","owner"],as_index=False).agg({"fk_money":"sum"})
# 合并owner_df和boss_df
result2_df = pd.merge(owner_df,boss_df,on="boss",how="left",suffixes=("_owner","_boss"))
result2_df["占比"] = (result_df["fk_money_owner"]/result_df["fk_money_boss"]).map(lambda x:"{:.2%}".format(x))
result2_df
bossownerfk_money_ownerfk_money_boss占比
0AA1306050.00%
1AA2306050.00%
2BB14015026.67%
3BB211015073.33%
4CC115034044.12%
5CC219034055.88%
解释:老板A手下的A1占总放款金额(60万)比例为50%。

更多好玩的内容,欢迎关注微信公众号“数据与编程之美”

数据与编程之美

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
使用pandasgroupby()方法时,可以结合apply()方法对分组后的数据进行操作。引用的代码演示了如何对变量df的"品种"列进行聚合,并使用apply()方法打印每个分组后的数据。通过这种方式,我们可以对每个分组进行自定义的操作或计算。引用的代码演示了如何在groupby()时使用as_index=False参数,以避免结果产生RangeIndex作为索引。通过这种方式,我们可以获得一个带有自定义列名的结果。引用的文章则提供了更多关于使用groupby().apply()的案例和技巧。总的来说,pandasgroupby()与apply()的结合可以帮助我们实现更灵活和高级的数据分析和处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python数据分析高阶应用技巧-pandas库聚合案例groupby().apply()写法强化】](https://blog.csdn.net/weixin_48964486/article/details/127588129)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Pandas.groupby.apply 的一些细节](https://blog.csdn.net/a597688570/article/details/127992318)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅帅的Python

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值