• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

学习groupby-agg用法

武飞扬头像
周工不解梦哦
帮助1

groupby 分组
数据如下

import pandas as pd
df=pd.read_excel('销售明细.xlsx')
print(df)

name 品种 数量 单价 金额 城市
0 张三 桔子 2 1.2 2.4 太原
1 李四 苹果 3 1.1 3.3 临汾
2 王五 苹果 4 1.4 5.6 临汾
3 张三 香蕉 5 2.1 10.5 太原
4 王五 桔子 6 1.3 7.8 临汾
5 tom 桃子 7 2.0 14.0 侯马

  name  品种  数量   单价    金额  城市
0   张三  桔子   2  1.2   2.4  太原
1   李四  苹果   3  1.1   3.3  临汾
2   王五  苹果   4  1.4   5.6  临汾
3   张三  香蕉   5  2.1  10.5  太原
4   王五  桔子   6  1.3   7.8  临汾
5  tom  桃子   7  2.0  14.0  侯马

hz=df.groupby('name').agg({'name':'count','金额':'sum'})
print(hz)
      name    金额
name            
tom      1  14.0
张三       2  12.9
李四       1   3.3
王五       2  13.4

1列,两个函数统计,改名

h=df.groupby('name')['金额'].agg(['count','sum']).rename(columns={'count':'cnt'})
print(h)
      cnt   sum
name           
tom     1  14.0
张三      2  12.9
李四      1   3.3
王五      2  13.4

统计且改名

h=df.groupby('name')['金额'].agg([('cnt','count'),('hj','sum')]) #较好的方法,直接变了列名
print(h.columns)
print(h)
Index(['cnt', 'hj'], dtype='object')
      cnt    hj
name           
tom     1  14.0
张三      2  12.9
李四      1   3.3
王五      2  13.4

换一种方法,会改变列名

h=df.groupby('name').agg({'金额':[('cnt','count'),('hj','sum')]}) #但列变成多重,MultiIndex([('金额', 'cnt'),
print(h.columns)
MultiIndex([('金额', 'cnt'),
            ('金额',  'hj')],
           )

h=df.groupby('name').agg({'金额':['count','sum']}).rename(columns={('金额','count'):'a'}) #改不了名
h.columns=['a','b'] #才能改了名

#所以,正确方法是
h=df.groupby('name').agg({'name':'count','金额':'sum','单价':'max','品种':'first'})
h.columns=['cnt','hj','最高单价','首单产品']
print(h)

#或者等效
h=df.groupby('name').agg({'金额':['count','sum'],'单价':'max','品种':'first'})


      cnt    hj  最高单价 首单产品
name                      
tom     1  14.0   2.0   桃子
张三      2  12.9   2.1   桔子
李四      1   3.3   1.1   苹果
王五      2  13.4   1.4   苹果

对照SQL的 select * form table1
left join
select * from table2

df2=pd.read_excel('联系方式.xlsx',dtype={'tel':str})
print(df2)
df3=pd.merge(df,df2,on='name',how='left') #相当于 left join
print(df3)

    name      tel
0     张三  2220003
1     李四  2220004
2  jerry    95000
3    tom    95001
4   jack    95002
  name  品种  数量   单价    金额  城市      tel
0   张三  桔子   2  1.2   2.4  太原  2220003
1   李四  苹果   3  1.1   3.3  临汾  2220004
2   王五  苹果   4  1.4   5.6  临汾      NaN
3   张三  香蕉   5  2.1  10.5  太原  2220003
4   王五  桔子   6  1.3   7.8  临汾      NaN
5  tom  桃子   7  2.0  14.0  侯马    95001

相当于 SQL的 having语句

g=df3.groupby('name').agg({'金额':['count','sum'],'tel':'first'})
print(g)

g.columns=['笔数','hj','tel']
having=g[g['hj']>10] #相当于having语句  或者 having=g[g[('金额','sum')]>10]
print(having)

        金额            tel
     count   sum    first
name                     
tom      1  14.0    95001
张三       2  12.9  2220003
李四       1   3.3  2220004
王五       2  13.4      NaN
      笔数    hj      tel
name                   
tom    1  14.0    95001
张三     2  12.9  2220003
王五     2  13.4      NaN

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggijea
系列文章
更多 icon
同类精品
更多 icon
继续加载