您的位置:首页 > 编程语言 > Python开发

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

2020-08-25 20:53 204 查看

pandas-数据聚合-分组计算

导入模块

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
from numpy import nan as NA
import matplotlib.pyplot as plt
plt.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']] 没有明显的分组依据,需要指明 mapper
df2[['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.自定义函数应用到对象上



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: