Python数据分析 知识量:13 - 56 - 232
数据分组是指根据一个或多个键(例如:DataFrame对象的列名等)将数据分成若干组,再对分组后的数据进行汇总计算。用于汇总计算的函数称为聚合函数。
在Python中,使用groupby()函数来实现数据分组,它类似于SQL语言中的group by语句。
可以将某一列名作为键,传递给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会自动进行判断并给出结果。
可以按照多个列名的进行数据分组,只需以列表的形式向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位于前面。
如果只想对某些列的数据进行分组,可以先利用索引筛选出目标数据,在进行汇总计算。
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数据进行分组。实际上,把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()函数用于数据分组时,可以实现两个特别的用途:
一次实现多种汇总方式。
对不同的列做不同的计算。
下面是应用示例:
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
分组后的计算结果并不是标准的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
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6