AI智能
改变未来

python-pandas11-数据聚合-分组计算


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



8.其他聚合函数



9.自定义函数应用到对象上



赞(0) 打赏
未经允许不得转载:爱站程序员基地 » python-pandas11-数据聚合-分组计算