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