pandas-数据聚合-分组计算
导入模块
import numpy as npimport pandas as pdfrom pandas import Series,DataFramefrom numpy import nan as NAimport matplotlib.pyplot as pltplt.rcParams[\'font.sans-serif\'] = [\'Microsoft YaHei\']
先创建一个DataFrame和一个Series
df1 = DataFrame({\'key1\':list(\'aabba\'),\'key2\':\'one,two,one,two,one\'.split(\',\'),\'data1\':np.random.randint(0,10,5),\'data2\':np.random.randint(0,10,5)})df1
s1 = df1[\'data1\']s1
1.Series.groupby
按照某个series 进行分组,返回一个分组后的对象
通俗来说就是将df1按照key1列分组,返回df1里data1这列也就是s1的值
s1.groupby(df1.key1)
可以用list() 转换,查看结构 .可以知道分组对象的每个值都是 分组依据和分组结果
list(s1.groupby(df1.key1))
分组对象是可以 直接 使用 聚合(统计)函数
s1.groupby(df1.key1).sum()
s1.groupby(df1.key1).mean()
s1.groupby(df1.key1).count()
2.DataFrame.groupby
按照df1的key2列分组,返回整个df1分组后的值
df1.groupby(df1.key2)
list(df1.groupby(df1.key2))
如果分组依据来自本身的某列,可以直接用列名称
list(df1.groupby(\'key2\'))
可以用其他 独立的 Series 进行分组
list(df1.groupby( Series([\'c\',\'c\',\'d\',\'d\',\'d\']) ))
可以直接使用聚合函数
df1.groupby( Series([\'c\',\'c\',\'d\',\'d\',\'d\']) ).sum()
df1.groupby( Series([\'c\',\'c\',\'d\',\'d\',\'d\']) ).max()
3.使用多个依据进行分组
DataFrame.groupby( [Series1, Series2,…] )
如果 Series(mapper)来自本身,可以直接使用列名称
DataFrame.groupby( [columnName1, columnName2,…] )
list(df1.groupby([df1.key1 ,df1.key2]))
list(df1.groupby([\'key1\',\'key2\']))
聚合函数
df1.groupby([\'key1\',\'key2\']).sum()
4.假设有很多列,只需要一两列进行分组与计算。
df2 = DataFrame(np.random.randint(0,10,(10,10)),columns=list(\'ABCDEFGHIJ\'))df2.insert(0,\'key2\',\'one,two,one,two,one\'.split(\',\')*2)df2.insert(0,\'key1\',list(\'aabbc\')*2)df2
如果需要分组计算的列并不多,我们可以
1-整体分组计算,然后取需要的列得到结果
2-先取需要的列,再进行分组计算
假设 取 A B 列计算数据
# 1- 整体分组计算df2.groupby([\'key1\',\'key2\']).sum()
# 1- 再取需要的列df2.groupby([\'key1\',\'key2\']).sum()[[\'A\',\'B\']]
# 2-先取需要的列,df2[[\'A\',\'B\']] 没有明显的分组依据,需要指明 mapperdf2[[\'A\',\'B\']].groupby([df2.key1,df2.key2]).sum()
5.分组对象,还可以转为list后再转为字典
grouped3 = df2[[\'key1\',\'key2\',\'A\',\'B\']].groupby([\'key1\',\'key2\'])grouped3
dict(list(grouped3))
# 两种写法dict(list(grouped3)).get( (\'b\',\'two\') )dict(list(grouped3))[(\'b\',\'two\')]
还可以根据列类型进行分组
df1
# 查看 df1 的列类型df1.dtypes
list(df1.groupby(df1.dtypes,axis=1))
6.xxx.astype( yy ) xxx对象的值转为 yy类型
df1.data2.astype(float)
7.可以按照 一列或 多列进行分组
如 key1 就是一列的值 ,其实是按行分,如 key1,key2 就是2列 的值 ,也是按行分
按列分组 ,如 按照类型分 dtype ,axis=1
# 读取 成绩.csv 前10个人的信息,姓名作为 行索引,学科作为列索引data = pd.read_csv(\'成绩.csv\' ,index_col=\'Unnamed: 0\')# 预览下前5条 。 xxx.head()data.head()
我们可以使用字典分组 用字典给每列取一个 别名 。
如 :语数外为主科,其他的为副科
mapping = {\'语文\':\'主科\',\'数学\':\'主科\'}
方法1:创建2个字典在组合成二维列表,再转为字典
方法2 : 直接循环
方法3