美文网首页
pandas数据分组与聚合

pandas数据分组与聚合

作者: 文嘉达_0da8 | 来源:发表于2020-06-21 18:04 被阅读0次

一、数据分组

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()
  • 按列表或元组分组
    需要是与待分组的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[ ]:

如果不想用默认的运算函数列名,可以元组的形式传入,前面为名称,后面为聚合函数。

tips.groupby(['sex','smoker'])['tip'].agg([('tip_mean','mean'),('Range',get_range)])
Out[ ]:
  • 多列多函数
    对多列多函数运算时,会产生层次化索引
tips.groupby(['day','time'])['total_bill','tip'].agg([('tip_mean','mean'),('Range',get_range)])
Out[ ]:
  • 不同列不同函数
tips.groupby(['day','time'])['total_bill','tip'].agg({'total_bill':['sum','mean'],'tip':'mean'})

三、分组运算

1. transform用法

tips['sex_average']=tips.groupby('sex')['tip'].transform('mean')
Out[ ]:

2. apply方法

def top(x,n=5):
    return x.sort_values(by='tip',ascending=False)[-n:]
tips.groupby('sex').apply(top)
Out[ ]:

四、数据透视表

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  表示合计列的列名

———————————————————
以上内容均来自书籍或网络,为个人的学习笔记,如有侵权,请联系删帖。

相关文章

网友评论

      本文标题:pandas数据分组与聚合

      本文链接:https://www.haomeiwen.com/subject/rklaxktx.html