pandas数据分组groupby()和统计函数agg()的使用


Posted in Python onMarch 04, 2021

数据分组

  • 使用 groupby() 方法进行分组
  • group.size()查看分组后每组的数量
  • group.groups 查看分组情况
  • group.get_group('名字') 根据分组后的名字选择分组数据

准备数据

# 一个Series其实就是一条数据,Series方法的第一个参数是data,第二个参数是index(索引),如果没有传值会使用默认值(0-N)
# index参数是我们自定义的索引值,注意:参数值的个数一定要相同。
# 在创建Series时数据并不一定要是列表,也可以将一个字典传进去。
from pandas import Series, DataFrame

# 使用字典创建
index_list = ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010']
name_list = ['李白', '王昭君', '诸葛亮', '狄仁杰', '孙尚香', '妲己', '周瑜', '张飞', '王昭君', '大乔']
age_list = [25, 28, 27, 25, 30, 29, 25, 32, 28, 26]
gender_list = ['F', 'M', 'F', 'F', 'M', 'M', 'F', 'F', 'M', 'M']
salary_list = ['10k', '12.5k', '20k', '14k', '12k', '17k', '18k', '21k', '22k', '21.5k']
marital_list = ['NO', 'NO', 'YES', 'YES', 'NO', 'NO', 'NO', 'YES', 'NO', 'YES']
dic = {
 '姓名': Series(data=name_list, index=index_list),
 '年龄': Series(data=age_list, index=index_list),
 '薪资': Series(data=salary_list, index=index_list),
 '性别': Series(data=gender_list, index=index_list),
 '婚姻状况': Series(data=marital_list, index=index_list)
}
df = DataFrame(dic)

# 写入csv,path_or_buf为写入文本文件
df.to_csv(path_or_buf='./People.csv', encoding='utf_8_sig')
print('end')

上面代码会在当前目录下生成一个 People.csv 文件

import pandas as pd
df = pd.read_csv('./People.csv')
df.head()

pandas数据分组groupby()和统计函数agg()的使用

# 根据 '性别列' 进行分组, 得到的是一个分组后的对象
groups = df.groupby('性别')
print(groups)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002953DAEBC88>

size()

使用groupby的size方法可以查看分组后每组的数量, 并返回一个含有分组大小的Series

print(groups.size())
性别
F 5
M 5
dtype: int64

可以只对一列数据进行分组, 只保留想要的数据

例如: 通过性别, 只对年龄进行分组

group = df['年龄'].groupby(df['性别'])
# 查看分组
print(group.groups)
# 根据分组后的名字选择分组
print(group.get_group('F'))
{'F': Int64Index([0, 2, 3, 6, 7], dtype='int64'), 'M': Int64Index([1, 4, 5, 8, 9], dtype='int64')}
0 25
2 27
3 25
6 25
7 32
Name: 年龄, dtype: int64
  • 代码df['年龄'].groupby(df['性别'])的逻辑是:取出df中'年龄'列数据,并且对该列数据根据df[‘性别']列数据进行分组操作
  • 这个代码也可写成df.groupby(df['性别'])['年龄'], 他的逻辑是: 将df数据通过df[‘性别']进行分组,然后再取出分组后的'年龄'列数据。两种写法达到的效果是一样的
  • group.groups的结果是一个字典,字典的key是分组后每个组的名字,对应的值是分组后的数据,此方法方便我们产看分组的情况
  • group.get_group('F')这个方法可以根据具体分组的名字获取,每个组的数据

 对分组进行遍历

import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性别')
# print(groups)
for group_name,group_df in groups:
 print('分组的名称:', group_name, '分组的数据', group_df.shape)
 print('-'*10)

分组的名称: F 分组的数据 (5, 6)
----------
分组的名称: M 分组的数据 (5, 6)
----------

- 将分组后的对象groups进行遍历,可以获取到group_name每个组的名字,group_df每个组的数据

import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性别')
for group_name,group_df in groups:
 f_mean = group_df['年龄'].mean()
 f_max = group_df['年龄'].max()
 f_min = group_df['年龄'].min()
 print('{}组的最大年龄是{},最小年龄是{},平均年龄是{}'.format(group_name,f_max,f_min,f_mean))

F组的最大年龄是32,最小年龄是25,平均年龄是26.8
M组的最大年龄是30,最小年龄是26,平均年龄是28.2

按多列进行分组

当需要按照多列进行分组的时候, groupby 方法里面我们传入一个列表, 列表分别存储分组依据的列名

注意: 列表中列名的顺序, 确定了先按XXXX列分组, 然后在按照YYYY列分组, 不同的顺序产生的分组名字是不同的

df = pd.read_csv('./People.csv')
group=df.groupby(['性别', '婚姻状况'])
df1 = group.size()
print(df1)
性别 婚姻状况
F  NO   2
  YES   3
M  NO   4
  YES   1
dtype: int64

group.size()返回的结果中发现索引值是多层的, 所以对于多索引值的获取, 只需要从外往里一层一层的取就可以啦, 就像我们睡觉之前,需要先脱外衣再脱掉内衣是一样的

size = df1['F'][ 'NO']
print(size)
2

pandas 常用统计函数

  • count() 统计列表中非空手机开的个数
  • nunique() 统计非重复的数据个数
  • sum() 统计列表中所有数值的和
  • mean() 计算列表中数据的平均值
  • median() 统计列表中数据中位数
  • max() 求列表中数据的最大值
  • min() 求列表中数据的最小值

对分组后的数据进行统计 agg()

import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性别')
for group_name,group_df in groups:
  f_se = group_df['年龄'].agg(['max','min','mean'])
  print('{}组的最大年龄是{},最小年龄是{},平均年龄是{}'.format(group_name,f_se[0],f_se[1],f_se[2]))

F组的最大年龄是32.0,最小年龄是25.0,平均年龄是26.8
M组的最大年龄是30.0,最小年龄是26.0,平均年龄是28.2

  • 在使用 agg() 函数时, 我们可以将多个统计函数一起放在一个 agg() 函数中
  • 如果是统计函数是pandas 提供的, 只需要将函数名字以字符串的形式存储到列表中即可
  • 例如: 将 max() 改成 ‘max'

自定义统计函数

当使用自定义的统计函数时
先创建统计函数

# 自定义的统计函数
def my_peak_range(df):
  """
  返回最大值与最小之间的范围
  """
  return df.max() - df.min()

# 使用
for group_name,group_df in groups:
  f_se = group_df['年龄'].agg(['max','min','mean',my_peak_range])
  print(f_se[0],f_se[1],f_se[3])
32.0 25.0 7.0
30.0 26.0 4.0

注意: 自定义函数名字传入agg() 函数时, 不需要转换成字符串

补充: 在这个数据中, 性别是什么的人总年龄最高

import pandas as pd
df = pd.read_csv('./People.csv')
groups = df.groupby('性别')
gende=groups.sum().sort_values(by='年龄',ascending=False).index.to_list()[0]
"""
这行代码, 先按性别进行分组, 然后吧每组中的数据求和得到总的年龄, 在按照年龄排序
再取出index,最后使用to_list()转换为列表,取出第一个数据
"""

print(gende)

M

开始按照性别分组, 组量太少, 数据也比较少, 本来准备算薪资总数, 但是单位忘记换了, 就这样吧

到此这篇关于pandas数据分组groupby()和统计函数agg()的使用的文章就介绍到这了,更多相关pandas groupby()和agg()内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python获取本机mac地址和ip地址的方法
Apr 29 Python
Python面向对象编程中关于类和方法的学习笔记
Jun 30 Python
python编程通过蒙特卡洛法计算定积分详解
Dec 13 Python
python使用sqlite3时游标使用方法
Mar 13 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python对文件目录的操作方法实例总结
Jun 24 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
python中sklearn的pipeline模块实例详解
May 21 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python timeit模块原理及使用方法
Oct 10 Python
Python Pandas知识点之缺失值处理详解
May 11 Python
pyx文件 生成pyd 文件用于 cython调用的实现
Mar 04 #Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
Mar 04 #Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 #Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 #Python
python 指定源路径来解决import问题的操作
Mar 04 #Python
python源文件的字符编码知识点详解
Mar 04 #Python
python3判断IP地址的方法
Mar 04 #Python
You might like
php格式化日期实例分析
2014/11/12 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
2015/10/27 PHP
thinkPHP自定义类实现方法详解
2016/11/30 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
jQuery封装的获取Url中的Get参数示例
2013/11/26 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
什么是cookie?js手动创建和存储cookie
2014/05/27 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
Angularjs实现下拉框联动的示例代码
2017/08/22 Javascript
HTML5+JS+JQuery+ECharts实现异步加载问题
2017/12/16 jQuery
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
Javascript操作select控件代码实例
2020/02/14 Javascript
python筛选出两个文件中重复行的方法
2018/05/31 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
python Opencv计算图像相似度过程解析
2019/12/03 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
Python map及filter函数使用方法解析
2020/08/06 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
2016国培研修心得体会
2016/01/08 职场文书
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
django中websocket的具体使用
2022/01/22 Python