Python数据分析

Python数据分析 知识量:13 - 56 - 232

9.1 数据分组><

基本概念- 9.1.1 -

数据分组是指根据一个或多个键(例如:DataFrame对象的列名等)将数据分成若干组,再对分组后的数据进行汇总计算。用于汇总计算的函数称为聚合函数。

在Python中,使用groupby()函数来实现数据分组,它类似于SQL语言中的group by语句。

按列名进行分组- 9.1.2 -

可以将某一列名作为键,传递给groupby()函数,实现数据分组。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.groupby('Sex'))

运行结果为:

       Name     Sex  Age  Chinese  English  Math
0      Noah    male   15       90       50    66
1      Emma  female   16       56       56    55
2       Bob    male   15       99       84    89
3    Olivia  female   17       86       87    44
4      Jeff    male   16       48       87    65
5      Liam    male   14       55       88    69
6    Sophia  female   15       90       66    96
7  Isabella  female   16       66       85    55 

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000028049118790>

运行的结果返回了一个DataFrameGroupBy对象,可以对该对象调用聚合函数来实现聚合计算。

下面对分组数据进行计数运算和求和运算:

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.groupby('Sex').count(),'\n')
print(df.groupby('Sex').sum())

运行结果为:

       Name     Sex  Age  Chinese  English  Math
0      Noah    male   15       90       50    66
1      Emma  female   16       56       56    55
2       Bob    male   15       99       84    89
3    Olivia  female   17       86       87    44
4      Jeff    male   16       48       87    65
5      Liam    male   14       55       88    69
6    Sophia  female   15       90       66    96
7  Isabella  female   16       66       85    55 

        Name  Age  Chinese  English  Math
Sex                                      
female     4    4        4        4     4
male       4    4        4        4     4 

        Age  Chinese  English  Math
Sex                                
female   64      298      294   250
male     60      292      309   289

注意:数值运算(求和运算等)只会适用于数值类型的列,Python会自动进行判断并给出结果。

按多个列名进行分组- 9.1.3 -

可以按照多个列名的进行数据分组,只需以列表的形式向groupby()函数传递列名即可,但要注意,列名的顺序很重要,先按照位于前面的列名进行分组,然后是下一个,以此类推。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.groupby(['Sex','Age']).count())

运行结果为:

       Name     Sex  Age  Chinese  English  Math
0      Noah    male   15       90       50    66
1      Emma  female   16       56       56    55
2       Bob    male   15       99       84    89
3    Olivia  female   17       86       87    44
4      Jeff    male   16       48       87    65
5      Liam    male   14       55       88    69
6    Sophia  female   15       90       66    96
7  Isabella  female   16       66       85    55 

            Name  Chinese  English  Math
Sex    Age                              
female 15      1        1        1     1
       16      2        2        2     2
       17      1        1        1     1
male   14      1        1        1     1
       15      2        2        2     2
       16      1        1        1     1

以上示例中,按照Sex和Age进行分组计数,但Sex位于前面。

对特定列进行分组- 9.1.4 -

如果只想对某些列的数据进行分组,可以先利用索引筛选出目标数据,在进行汇总计算。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.groupby('Sex')['Name'].count())

运行结果为:

       Name     Sex  Age  Chinese  English  Math
0      Noah    male   15       90       50    66
1      Emma  female   16       56       56    55
2       Bob    male   15       99       84    89
3    Olivia  female   17       86       87    44
4      Jeff    male   16       48       87    65
5      Liam    male   14       55       88    69
6    Sophia  female   15       90       66    96
7  Isabella  female   16       66       85    55 

Sex
female    4
male      4
Name: Name, dtype: int64

以上示例中,统计不同性别的人数时,只汇总计算姓名列就可以,因此通过索引选出Name列就可以了。

按Series进行分组- 9.1.5 -

除了使用列名,还可以使用Series数据进行分组。实际上,把DataFrame对象的其中一列取出来就是一个Series。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx")
print(df,'\n')
print(df.groupby(df['Sex']).count(),'\n')  # 使用Series进行分组
print(df.groupby('Sex').count())  # 使用列名进行分组

运行结果为:

       Name     Sex  Age  Chinese  English  Math
0      Noah    male   15       90       50    66
1      Emma  female   16       56       56    55
2       Bob    male   15       99       84    89
3    Olivia  female   17       86       87    44
4      Jeff    male   16       48       87    65
5      Liam    male   14       55       88    69
6    Sophia  female   15       90       66    96
7  Isabella  female   16       66       85    55 

        Name  Age  Chinese  English  Math
Sex                                      
female     4    4        4        4     4
male       4    4        4        4     4 

        Name  Age  Chinese  English  Math
Sex                                      
female     4    4        4        4     4
male       4    4        4        4     4

以上示例表明,与使用列名相比,使用Series进行分组,计算结果没有什么区别。

aggregate()函数- 9.1.6 -

aggregate()函数用于数据分组时,可以实现两个特别的用途:

  1. 一次实现多种汇总方式。

  2. 对不同的列做不同的计算。

下面是应用示例:

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx",usecols=[1,2,3])
print(df,'\n')
print(df.groupby('Sex').aggregate(['count','sum']),'\n')  # 一次实现多种汇总方式
print(df.groupby('Sex').aggregate({'Age':'count','Chinese':'sum'}))  # 对不同的列做不同的计算

运行结果为:

      Sex  Age  Chinese
0    male   15       90
1  female   16       56
2    male   15       99
3  female   17       86
4    male   16       48
5    male   14       55
6  female   15       90
7  female   16       66 

         Age     Chinese     
       count sum   count  sum
Sex                          
female     4  64       4  298
male       4  60       4  292 

        Age  Chinese
Sex                 
female    4      298
male      4      292

格式化分组结果- 9.1.7 -

分组后的计算结果并不是标准的DataFrame形式,为了便于后续数据处理,可以将分组结果格式化为DataFrame对象,具体方法是通过reset_index()函数来重置索引。

import pandas as pd
df=pd.read_excel(r"D:\PythonTestFile\exam_new.xlsx",usecols=[1,2,3])
print(df,'\n')
print(df.groupby('Age').mean(),'\n')  # 默认形式
print(df.groupby('Age').mean().reset_index())  # 重置索引

运行结果为:

      Sex  Age  Chinese
0    male   15       90
1  female   16       56
2    male   15       99
3  female   17       86
4    male   16       48
5    male   14       55
6  female   15       90
7  female   16       66 

       Chinese
Age           
14   55.000000
15   93.000000
16   56.666667
17   86.000000 

   Age    Chinese
0   14  55.000000
1   15  93.000000
2   16  56.666667
3   17  86.000000