一、数据分组
1.groupby简介
groupby的运算核心为split-apply-combine,首先,数据及按照key的方式分成小的数据片(split),然后对每一个数据片进行操作,如分类求和(apply)最后将结果再组合起来形成新的数据集(combine)。
- 按列名分组
import pandas as pd
import seaborn as sns
tips=sns.load_dataset('tips')
tips.head()
Out[ ]:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
tips.groupby('smoker').mean()
Out[ ]:
total_bill tip size
smoker
Yes 20.756344 3.008710 2.408602
No 19.188278 2.991854 2.668874
tips['tip'].groupby(tips['size']).mean()
Out[ ]:
size
1 1.437500
2 2.582308
3 3.393158
4 4.135405
5 4.028000
6 5.225000
Name: tip, dtype: float64
#也可以写为
tips.groupby('size']['tip'],mean()
- 按照多列进行分组
tips.groupby(['day','time']).mean()
![](https://img.haomeiwen.com/i23706959/d1055f6e82fc4eb8.jpg)
- 按列表或元组分组
需要是与待分组的DataFrame的行数一样,可以理解为就是把列表或元组当成是DataFrame的一列,然后按其分组。
import numpy as np
df=pd.DataFrame(np.arange(16).reshape(4,4))
Out[ ]:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
list1=['a','b','a','b']
df.groupby(list1).sum()
Out[ ]:
0 1 2 3
a 8 10 12 14
b 16 18 20 22
- 按字典分组
import numpy as np
df=pd.DataFrame(np.arange(36).reshape(6,6),index=['a','b','c','A','B','C'])
Out[ ]:
0 1 2 3 4 5
a 0 1 2 3 4 5
b 6 7 8 9 10 11
c 12 13 14 15 16 17
A 18 19 20 21 22 23
B 24 25 26 27 28 29
C 30 31 32 33 34 35
dict1={
'a':'one',
'A':'one',
'b':'two',
'B':'two',
'c':'three',
'C':'three'
}
df.groupby(dict1).sum()
Out[ ]:
0 1 2 3 4 5
one 18 20 22 24 26 28
three 42 44 46 48 50 52
two 30 32 34 36 38 40
- 按函数分组
def jug(x):
if x>15:
return 'a'
else:
return 'b'
df[3].groupby(df[3].map(jug)).sum()
Out[ ]:
3
a 81
b 27
Name: 3, dtype: int32
二、聚合运算
1. 聚合函数
count:计数
sum:求和
mean:求平均值
median:求中位数
std、var:无偏标准差和方差
min、max:求最小值和最大值
prod:求积
first、last:第一个和最后一个值
2. 多函数应用
- 一列多函数
def get_range(x):
return x.max()-x.min()
tips.groupby(['sex','smoker'])['tip'].agg(['mean','std',get_range])
Out[ ]:
![](https://img.haomeiwen.com/i23706959/dd182e2a2286aafe.png)
如果不想用默认的运算函数列名,可以元组的形式传入,前面为名称,后面为聚合函数。
tips.groupby(['sex','smoker'])['tip'].agg([('tip_mean','mean'),('Range',get_range)])
Out[ ]:
![](https://img.haomeiwen.com/i23706959/9abcad454d859683.png)
- 多列多函数
对多列多函数运算时,会产生层次化索引
tips.groupby(['day','time'])['total_bill','tip'].agg([('tip_mean','mean'),('Range',get_range)])
Out[ ]:
![](https://img.haomeiwen.com/i23706959/dfe8ee55f460fa4e.png)
- 不同列不同函数
tips.groupby(['day','time'])['total_bill','tip'].agg({'total_bill':['sum','mean'],'tip':'mean'})
![](https://img.haomeiwen.com/i23706959/5d946293a6852c29.png)
三、分组运算
1. transform用法
tips['sex_average']=tips.groupby('sex')['tip'].transform('mean')
Out[ ]:
![](https://img.haomeiwen.com/i23706959/9146b3695c84129e.png)
2. apply方法
def top(x,n=5):
return x.sort_values(by='tip',ascending=False)[-n:]
tips.groupby('sex').apply(top)
Out[ ]:
![](https://img.haomeiwen.com/i23706959/8d6ca6febc92269b.png)
四、数据透视表
pd.pivot_table(data,values=None,index=None,columns=None,aggfunc='mean',fill_value=None,margins=False,dropna_Ture,margins_name='All')
#data 表示要做数据透视的整个表
#values 表示对应excel值的那个框
#index 表示对应excel行的那个框
#columns 表示对应excel列的那个框
#aggfunc 表示对values的计算类型
#fill_value 表示对空值的填充值
#margins 表示是否显示合计列
#dropna 表示是否删除缺失
#margins_name 表示合计列的列名
———————————————————
以上内容均来自书籍或网络,为个人的学习笔记,如有侵权,请联系删帖。
网友评论