首页 > 其他分享 >pandas分组统计-groupby详解

pandas分组统计-groupby详解

时间:2023-12-06 17:48:28浏览次数:35  
标签:grouped df groupby np 详解 分组 print pandas

pandas分组统计-groupby详解

数据分组

分组统计 - groupby功能

① 根据某些条件将数据拆分成组
② 对每个组独立应用函数
③ 将结果合并到一个数据结构中

Dataframe在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中。

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

注:因为输出结果冗长,请读者自行赋值粘贴到jupyter(推荐)中运行。欢迎评论交流

分组

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})
print(df)
print('------')
 
print(df.groupby('A'), type(df.groupby('A')))
print('------')
# 直接分组得到一个groupby对象,是一个中间数据,没有进行计算
 
a = df.groupby('A').mean()
b = df.groupby(['A','B']).mean()
c = df.groupby(['A'])['D'].mean()  # 以A分组,算D的平均值
print("-----------------")
print(a,type(a),'\n',a.columns)
print()
print(b,type(b),'\n',b.columns)
print()
print(c,type(c))
# 通过分组后的计算,得到一个新的dataframe
# 默认axis = 0,以行来分组
# 可单个或多个([])列分组<br><br>#按A列分组求出A,B列的个数grouped = df.groupby(["A"])<br>n = grouped.agg({"A": ["count", pd.Series.unique], "B": pd.Series.nunique})<br>print(n)
A      B         C         D
0  foo    one -1.933969  0.238314
1  bar    one  0.536373  1.236740
2  foo    two  1.616592  0.892705
3  bar  three -0.756126  0.314298
4  foo    two -0.714277  1.889881
5  bar    two -0.036717 -0.705121
6  foo    one  0.476361 -0.626030
7  foo  three -0.614447 -0.267740
-------
~~~~~~~
========
            C         D
A                      
bar -0.085490  0.281972
foo -0.233948  0.425426 <class 'pandas.core.frame.DataFrame'> 
 Index(['C', 'D'], dtype='object')

                  C         D
A   B                        
bar one    0.536373  1.236740
    three -0.756126  0.314298
    two   -0.036717 -0.705121
foo one   -0.728804 -0.193858
    three -0.614447 -0.267740
    two    0.451158  1.391293 <class 'pandas.core.frame.DataFrame'> 
 Index(['C', 'D'], dtype='object')

A
bar    0.281972
foo    0.425426
Name: D, dtype: float64 <class 'pandas.core.series.Series'>

分组 - 可迭代对象

df = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]})
print(df)
print(df.groupby('X'), type(df.groupby('X')))
print('-----')
X  Y
0  A  1
1  B  4
2  A  3
3  B  2
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000278C6F69910> <class 'pandas.core.groupby.generic.DataFrameGroupBy'>
 
print(list(df.groupby('X')), '→ 可迭代对象,直接生成list\n')
print(list(df.groupby('X'))[0], '→ 以元祖形式显示\n')
for n,g in df.groupby('X'):
    print(n)
    print(g)
    print('###')
print('-----')
# n是组名,g是分组后的Dataframe

A
   X  Y
0  A  1
2  A  3
####
B
   X  Y
1  B  4
3  B  2
####
 
print(df.groupby(['X']).get_group('A'),'\n')
print(df.groupby(['X']).get_group('B'),'\n')
print('-----')
# .get_group()提取分组后的组

 
grouped = df.groupby(['X'])
print(grouped.groups)
print(grouped.groups['A'])  # 也可写:df.groupby('X').groups['A']
print('-----')
# .groups:将分组后的groups转为dict
# 可以字典索引方法来查看groups里的元素
 
sz = grouped.size()
print(sz,type(sz))
print('-----')
# .size():查看分组后的长度
 
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8),
                   'D' : np.random.randn(8)})
print(df)
print()
print(df.groupby(['A','B']))
print()
grouped = df.groupby(['A','B']).groups
 
print(grouped)
print()
print(grouped[('foo', 'three')])
# 按照两个列进行分组

其他轴上的分组

import pandas as pd
import numpy as np
 
df = pd.DataFrame({'data1':np.random.rand(2),
                  'data2':np.random.rand(2),
                  'key1':['a','b'],
                  'key2':['one','two']})
print(df)
print(df.dtypes)
print("-------------")
print(df.groupby(df.dtypes, axis=1))
print('-----')
print(list(df.groupby(df.dtypes, axis=1)))
print()
for n,p in df.groupby(df.dtypes, axis=1):
    print(n)
    print()
    print(p)
    print('##')
# 按照值类型分列

通过字典或者Series分组

df = pd.DataFrame(np.arange(16).reshape(4,4),
                  columns = ['a','b','c','d'])
print(df)
print('-----')
 
mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
by_column = df.groupby(mapping, axis = 1)
print(by_column.sum())
print('-----')
# mapping中,a、b列对应的为one,c、d列对应的为two,以字典来分组
 
s = pd.Series(mapping)
print(s,'\n')
print(s.groupby(s).count())
# s中,index中a、b对应的为one,c、d对应的为two,以Series来分组

通过函数分组

df = pd.DataFrame(np.arange(16).reshape(4,4),
                  columns = ['a','b','c','d'],
                 index = ['abc','bcd','aa','b'])
print(df,'\n')
print(df.groupby(len).sum())
# 按照字母长度分组

分组计算函数方法

s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3])
grouped = s.groupby(level=0)  # 唯一索引用.groupby(level=0),将同一个index的分为一组
print(grouped)
print(grouped.first(),'→ first:非NaN的第一个值\n')
print(grouped.last(),'→ last:非NaN的最后一个值\n')
print(grouped.sum(),'→ sum:非NaN的和\n')
print(grouped.mean(),'→ mean:非NaN的平均值\n')
print(grouped.median(),'→ median:非NaN的算术中位数\n')
print(grouped.count(),'→ count:非NaN的值\n')
print(grouped.min(),'→ min、max:非NaN的最小值、最大值\n')
print(grouped.std(),'→ std,var:非NaN的标准差和方差\n')
print(grouped.prod(),'→ prod:非NaN的积\n')

多函数计算:agg()

df = pd.DataFrame({'a':[1,1,2,2],
                  'b':np.random.rand(4),
                  'c':np.random.rand(4),
                  'd':np.random.rand(4),})
print(df)
print(df.groupby('a').agg(['mean',np.sum]))
print(df.groupby('a')['b'].agg({'result1':np.mean,
                               'result2':np.sum}))
# 函数写法可以用str,或者np.方法
# 可以通过list,dict传入,当用dict时,key名为columns

  

下面是一个测试题,大家可以尝试一下

按要求创建Dataframe df(如下图),并通过分组得到以下结果
① 以A分组,求出C,D的分组平均值
② 以A,B分组,求出D,E的分组求和
③ 以A分组,得到所有分组,以字典显示
④ 按照数值类型分组,求和
⑤ 将C,D作为一组分出来,并计算求和
⑥ 以B分组,求出每组的均值,求和,最大值,最小值

import pandas as pd
import numpy as np
 
df = pd.DataFrame({"A":["one","two","three","one","two","three","one","two"],
                  "B":(list("hhhh") + list("ffff")),
                   "C":range(10,26,2),
                   "D":np.random.randn(8),
                   "E":np.random.rand(8)
                  })
print(df)
print("----------以A分组,求出CD的分组平均值-------------")
print(df.groupby(["A"], axis = 0)["C","D"])
df1 = df.groupby(["A"], axis = 0)["C","D"].mean()   # 先聚合
print(df1)
print("-----------以AB分组,求DE的分组和--------")
df2 = df.groupby(["A", "B"], axis = 0)["D","E"].sum()   # 先聚合
print(df2)
print("-----------以A分组,得到所有分组的字典--------")
df2 = df.groupby(["A"], axis = 0)
print(df2.groups)
print("按照数值类型分组,求和")
df3 = df.groupby(df.dtypes, axis = 1).sum()
print(df3)
print("----------将CD作为一组分出来,并计算求和-----------")
mapping = {"C":"one", "D":"one"}
print(df.groupby(mapping, axis = 1).sum())
print("------------以B分组,求每一组的均值、和、最大值、最小值-----------------------------------------------------")
print(df.groupby(["B"]).agg([np.mean, np.sum, np.max, np.min]))

标签:grouped,df,groupby,np,详解,分组,print,pandas
From: https://www.cnblogs.com/mengdie1978/p/17880112.html

相关文章

  • pandas函数映射
    pandas函数映射importpandasaspdimportnumpyasnpfrompandasimportSeries,DataFramedf1=DataFrame(np.random.choice(range(20),size=(4,3),replace=False),index=list('ABCD'),columns=list('abc'))print(df1)#使用numpy函......
  • Pandas数据处理:空值清洗、替换填充、级联与合并拼接
    Pandas数据处理:空值清洗、替换填充、级联与合并拼接针对空值的处理,首先要来了解一下空值的类型:一、pandas中的None和NaN有什么区别?type(None)--类型是NoneType空的对象类型type(NaN)--类型是float浮点型注意:Pandas中None和NaN都视作np.nan二、Pandas的空值......
  • Vue 应用程序性能优化:代码压缩、加密和混淆配置详解
    ​简介在Vue应用程序的开发中,代码压缩、加密和混淆是优化应用程序性能和提高安全性的重要步骤。VueCLI是一个功能强大的开发工具,它提供了方便的配置选项来实现这些功能。本文将介绍如何使用VueCLI配置代码压缩、加密和混淆功能,以提高应用程序的性能和安全性。一、配置代......
  • Pandas数据预处理python 数据分析之4——pandas 预处理在线闯关_头歌实践教学平台
    Pandas数据预处理python数据分析之4——pandas预处理第1关数据读取与合并第2关数据清洗第3关数据转换第1关数据读取与合并任务描述本关任务:加载csv数据集,实现DataFrame合并。编程要求根据提示,在右侧编辑器补充代码,完成本关任务。测试说明平台会对你的代码进行测试,若......
  • Pandas数据预处理Pandas合并数据集在线闯关_头歌实践教学平台
    Pandas数据预处理合并数据集第1关Concat与Append操作第2关合并与连接第3关案例:美国各州的统计数据第1关Concat与Append操作任务描述本关任务:使用read_csv()读取两个csv文件中的数据,将两个数据集合并,将索引设为Ladder列,并将缺失值填充为0。编程要求data.csv和data1.csv是两......
  • Pandas数据分析Pandas进阶在线闯关_头歌实践教学平台
    Pandas数据分析进阶第1关Pandas分组聚合第2关Pandas创建透视表和交叉表第1关Pandas分组聚合任务描述本关任务:使用Pandas加载drinks.csv文件中的数据,根据数据信息求每个大洲红酒消耗量的最大值与最小值的差以及啤酒消耗量的和。编程要求使用Pandas中的read_csv()......
  • Pandas数据分析Pandas初体验在线闯关_头歌实践教学平台
    Pandas数据分析初体验第1关了解数据处理对象--Series第2关了解数据处理对象-DataFrame第3关读取CSV格式数据第4关数据的基本操作——排序第5关数据的基本操作——删除第6关数据的基本操作——算术运算第7关数据的基本操作——去重第8关数据重塑第1关了解数据处理对象......
  • 第五节:哈希表详解 和 面试题剖析
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 使用ThinkPHP框架根据Excel内容批量处理图片名称详解记录
    ThinkPHP依赖以下环境Nginx+PHP,建议提前装好Composer,PHP、Composer需要设置好系统环境变量。1.通过Composer安装Laravel框架composercreate-projecttopthink/thinkthinkphp6启动服务测试cdthinkphp6phpthinkrun然后就可以在浏览器中访问http://localhost:8000如果不能显示......
  • MySQL EXPLAIN详解
    MySQL数据库是许多Web应用程序的底层支持,而查询性能的优化是确保系统高效运行的关键。在MySQL中,EXPLAIN是一项强大的工具,可帮助开发者深入了解查询语句的执行计划,从而更好地优化查询性能。本文将详细解析MySQL的EXPLAIN关键字,以揭开查询执行计划的面纱。什么是EXPLAIN?mysql官网......