读书记录——pandas中的分组方法groupby(一)
pandas的group分组
1、第一个简单案例
1)数据和依赖包准别
import pandas as pd
import numpy as np
import random
df = pd.DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'], 'key2': ['one', 'two', 'one', 'two', 'one'], 'data1': np.random.randint(5, 100, 5), 'data2': np.random.randint(5, 100, 5)})
df
key1 key2 data1 data2
0 a one 35 50
1 a two 81 50
2 b one 25 29
3 b two 50 21
4 a one 71 53
假设你想要根据key1标签计算data1列的均值,有多种方法可以实现。其中一种是访问data1并使用key1列(它是一个Series)调用groupby方法
2)假设你想要根据key1标签计算data1列的均值,有多种方法可以实现。其中一种是访问data1并使用key1列(它是一个Series)调用groupby方法
grouped = df['data1'].groupby(df['key1'])
grouped.mean()
key1
a 62.333333
b 37.500000
Name: data1, dtype: float64
解释:数据(一个Series)根据分组键进行了聚合,并产生了一个新的Series,这个Series使用key1列的唯一值作为索引。由于DataFrame的列df[‘key1’],结果中的索引名称是’key1’。
3)还可以将多个数组作为列表传入, 这里要用 []阔气两列,否则会报错:‘Series’ objects are mutable, thus they cannot be hashed’
means = df['data1'].groupby([df['key1'], df['key2']]).mean()
means
key1 key2
a one 53two 81
b one 25two 50
Name: data1, dtype: int64
means.unstack()
key2 one two
key1
a 53 81
b 25 50
4)上面的例子是使用 dataframe自己的列作为分组键,实际上我们还可以通过和df长度相同的任何数组进行分组。
states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
df['data1'].groupby([states, years]).mean()
California 2005 81.02006 25.0
Ohio 2005 42.52006 71.0
Name: data1, dtype: float64
5)通常包含在同一个DataFrame中。在这种情况下,你可以传递列名(无论那些列名是字符串、数字或其他Python对象)
df.groupby(['key1', 'key2']).mean()
data1 data2
key1 key2
a one 53.0 51.5
two 81.0 50.0
b one 25.0 29.0
two 50.0 21.0
6)请注意,分组键中的任何缺失值将被排除在结果之外。
#size方法返回一个包含组大小信息的Series
df.groupby(['key1', 'key2']).size()
key1 key2
a one 2two 1
b one 1two 1
dtype: int64df['key1'][0]=np.nan
df.groupby(['key1', 'key2']).size()key1 key2
a one 1two 1
b one 1two 1
dtype: int64
7)GroupBy对象支持迭代,会生成一个包含组名和数据块的2维元组序列。
for name, group in df.groupby(['key1','key2']):print(name)print(group)
('a', 'one')key1 key2 data1 data2
4 a one 71.0 53
('a', 'two')key1 key2 data1 data2
1 a two 81.0 50
('b', 'one')key1 key2 data1 data2
2 b one 25.0 29
('b', 'two')key1 key2 data1 data2
3 b two 50.0 21#dict 当中key是分组的值,value 是 dataframe
pieces = dict(list(df.groupby(['key1'])))
pieces['b']key1 key2 data1 data2
2 b one 25.0 29
3 b two 50.0 21
8)默认情况下,groupby在axis=0的轴向上分组,但你也可以在其他任意轴向上进行分组。
df.dtypes
c = dict(list(df.groupby(df.dtypes, axis=1)))
2、使用字典和Series 进行分组
1)数据准备:分组信息可能会以非数组形式存在。让我们考虑另一个示例DataFrame:
people = pd.DataFrame(np.random.randn(5, 5), columns=['a', 'b', 'c', 'd', 'e'], index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.iloc[2:3,[1,2]] = np.nan
people
a b c d e
Joe 0.451761 0.560375 1.103920 -2.109583 -1.124331
Steve 0.230661 0.100864 -0.820433 -1.095237 2.339748
Wes 1.083413 NaN NaN 0.334879 -0.533430
Jim -0.015605 0.412183 1.185844 -1.781339 -0.181708
Travis 0.990184 0.092683 0.399024 -1.021718 -0.913895
2)使用mapping进行分组,假设现在有个列的分组对应关系,并且向按照分组对应的值,按组累加:
mapping = {'a':'red', 'b':'red', 'c':'blue', 'd':'blue', 'e':'red', 'f':'orange'}
people.groupby(mapping, axis=1).sum()
blue red
Joe -1.005663 -0.112195
Steve -1.915670 2.671273
Wes 0.334879 0.549984
Jim -0.595495 0.214870
Travis -0.622694 0.168971
3)使用Series进行分组
p_s = pd.Series(mapping)
people.groupby(p_s, axis=1).sum()
blue red
Joe -1.005663 -0.112195
Steve -1.915670 2.671273
Wes 0.334879 0.549984
Jim -0.595495 0.214870
Travis -0.622694 0.168971
3、使用函数分组
1)使用上面的people 中的名字长度作为分组条件
people.groupby(len).sum()
a b c d e
3 1.519570 0.972558 2.289764 -3.556042 -1.839469
5 0.230661 0.100864 -0.820433 -1.095237 2.339748
6 0.990184 0.092683 0.399024 -1.021718 -0.913895
4、根据分层索引分组
1)分层索引的数据集非常方便的地方,就是能够在轴索引的某个层级上进行聚合
columns = pd.MultiIndex.from_arrays([['US', 'US', 'US', 'JP', 'JP'], [1, 3, 5, 1, 3]], names=['cty', 'tenor'])
hier_df = pd.DataFrame(np.random.randn(4, 5), columns=columns)
hier_df
cty US JP
tenor 1 3 5 1 3
0 -1.831356 -0.599970 -0.402924 -1.346936 -0.804407
1 1.281934 -0.863460 -1.312391 -0.904404 -0.774328
2 -0.457876 -0.300016 0.450341 -0.517754 0.742083
3 0.269457 -0.522661 0.748308 -0.869600 -0.588432hier_df.groupby(level='cty', axis=1).sum()
cty JP US
0 -2.151343 -2.834250
1 -1.678732 -0.893917
2 0.224328 -0.307551
3 -1.458032 0.495104
5、数据聚合
1)直接调用Series方法进行聚合
#使用初始df进行计算
df
key1 key2 data1 data2
0 NaN one 66.0 50
1 a two 81.0 50
2 b one 25.0 29
3 b two 50.0 21
4 a one 71.0 53
grouped = df[['key2','data1','data2']].groupby('key2')
grouped.quantile(0.9)
0.9 data1 data2
key2
one 70.0 52.4
two 77.9 47.1
解释:尽管quantile并不是显式地为GroupBy对象实现的,但它是Series的方法,因此也可以用于聚合。在内部,GroupBy有效地对Series进行切片,为每一块调用piece. quantile(0.9),然后将这些结果一起组装到结果对象中
2)使用自定义方法进行聚合
#输入为Series ,输出为数值
def peak_to_peak(arr):# print('this:',type(arr))# print(arr)return max(arr) - min(arr)
# 要使用你自己的聚合函数, 需要将函数传递给 agg方法:
grouped.agg(peak_to_peak)
size tip tip_pct total_bill
day smoker
Fri No 1 2.00 0.067349 10.29
Yes 3 3.73 0.159925 34.42
Sat No 3 8.00 0.235193 41.08
Yes 4 9.00 0.290095 47.74
Sun No 4 4.99 0.193226 39.40
Yes 3 5.00 0.644685 38.10
Thur No 5 5.45 0.193350 33.68
Yes 2 3.00 0.151240 32.77
6、逐级多列运用聚合函数
待续。。。
读书记录——pandas中的分组方法groupby(一)相关推荐
- python中怎么做分组问题_详解Python中的分组函数groupby和itertools)
具体代码如下所示: from operator import itemgetter #itemgetter用来去dict中的key,省去了使用lambda函数 from itertools impor ...
- 数据特征分析:相关性分析(Pandas中的corr方法)
文章目录 1.图示初判 两个变量之间的相关性(散点图) 多变量之间的相关性(散点图矩阵) 2.Pearson相关系数 3.Spearman相关系数 分析连续变量之间的线性相关程度的强弱 介绍如下几种方 ...
- Pandas中的 transform() 结合 groupby() 用法示例
首先,假设我们有如下餐厅数据集: import pandas as pddf = pd.DataFrame({'restaurant_id': [101,102,103,104,105,106,107 ...
- 小记pandas中DataFrame.dropna方法
DateFrame对象中dropna方法可以删除空值 这里简单记录一下用法 import pandas as pd import pymysqlconn = pymysql.connect(host= ...
- pandas中的get_dummies方法
参考:https://blog.csdn.net/u010665216/article/details/78635664?utm_source=copy https://blog.csdn.net/l ...
- pandas中concat/append方法
目录 concat方法 concat语法 concat代码 append方法 append语法 append代码 concat方法 concat⽅法类似于数据库中union all,在不同的轴方向 ...
- pandas中的sample方法
sample()函数
- 记录vue中promis使用方法
<el-button type="success" @click="sendVerify('abc')">通过验证</el-button> ...
- pandas中的to_excel方法解析
最新文章
- 搜索引擎选择: Elasticsearch与Solr
- module compiled against API version 0xb but this version of numpy is 0xa
- android如何编译lame,Android 编译 Lame 库心路历程
- 通过 url 参数 parameters 和 script tag 属性来配置 SAP UI5 运行时
- verilog中function用法_verilog中的function用法与例子
- C++ Builder 启动时不显示主窗体
- 2019 年总结 | 31岁,不过是另一个开始
- mysql 事物隔离级别解读
- 随想录(关于论文投稿)
- Makefile 函数
- 多个客户端共用同一条拉起链接 ,如何配置 Universal Link iOS App
- Hplus框架动态添加选项卡功能(扩展)
- 近义词替换-近义词替换器-免费近义词替换器
- linux如何查询文件及文件夹大小
- luoguP4578_ [FJOI2018]所罗门王的宝藏
- 1182: 零起点学算法89——母牛的故事(*)
- SparkSQL专题1 ~ 造数
- unirech:阿里云国际站云服务器和国内站产品有什么区别?
- RISC-V调用惯例
- java swt 双屏_微星主板B350M接双屏显示器,显卡接的显示器有反应,主板接的显示器没放映...
热门文章
- bzoj2749: [HAOI2012]外星人
- 姓氏头像框一键制作小程序源码+附微语模块
- 【数据结构】set重载 < 运算符
- 2019年互联网最高薪的25大职位,排第一竟是....
- SpringBoot+Kafka+ELK 完成海量日志收集(超详细)
- 【EOS钱包开发 一】EOS不得不说的一些概念
- 电销机器人帮助你提高工作效率
- 浅谈session实现原理(阿里面试题)
- 2023湖北大学计算机考研信息汇总
- 抖音直播间我打的字别人看不见,抖音直播打字看不见怎么回事