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(一)相关推荐

  1. python中怎么做分组问题_详解Python中的分组函数groupby和itertools)

    具体代码如下所示: from operator import itemgetter #itemgetter用来去dict中的key,省去了使用lambda函数 from itertools impor ...

  2. 数据特征分析:相关性分析(Pandas中的corr方法)

    文章目录 1.图示初判 两个变量之间的相关性(散点图) 多变量之间的相关性(散点图矩阵) 2.Pearson相关系数 3.Spearman相关系数 分析连续变量之间的线性相关程度的强弱 介绍如下几种方 ...

  3. Pandas中的 transform() 结合 groupby() 用法示例

    首先,假设我们有如下餐厅数据集: import pandas as pddf = pd.DataFrame({'restaurant_id': [101,102,103,104,105,106,107 ...

  4. 小记pandas中DataFrame.dropna方法

    DateFrame对象中dropna方法可以删除空值 这里简单记录一下用法 import pandas as pd import pymysqlconn = pymysql.connect(host= ...

  5. pandas中的get_dummies方法

    参考:https://blog.csdn.net/u010665216/article/details/78635664?utm_source=copy https://blog.csdn.net/l ...

  6. pandas中concat/append方法

    目录 concat方法 concat语法 concat代码​​ append方法 append语法 append代码 concat方法 concat⽅法类似于数据库中union all,在不同的轴方向 ...

  7. pandas中的sample方法

    sample()函数

  8. 记录vue中promis使用方法

    <el-button type="success" @click="sendVerify('abc')">通过验证</el-button> ...

  9. pandas中的to_excel方法解析

最新文章

  1. 搜索引擎选择: Elasticsearch与Solr
  2. module compiled against API version 0xb but this version of numpy is 0xa
  3. android如何编译lame,Android 编译 Lame 库心路历程
  4. 通过 url 参数 parameters 和 script tag 属性来配置 SAP UI5 运行时
  5. verilog中function用法_verilog中的function用法与例子
  6. C++ Builder 启动时不显示主窗体
  7. 2019 年总结 | 31岁,不过是另一个开始
  8. mysql 事物隔离级别解读
  9. 随想录(关于论文投稿)
  10. Makefile 函数
  11. 多个客户端共用同一条拉起链接 ,如何配置 Universal Link iOS App
  12. Hplus框架动态添加选项卡功能(扩展)
  13. 近义词替换-近义词替换器-免费近义词替换器
  14. linux如何查询文件及文件夹大小
  15. luoguP4578_ [FJOI2018]所罗门王的宝藏
  16. 1182: 零起点学算法89——母牛的故事(*)
  17. SparkSQL专题1 ~ 造数
  18. unirech:阿里云国际站云服务器和国内站产品有什么区别?
  19. RISC-V调用惯例
  20. java swt 双屏_微星主板B350M接双屏显示器,显卡接的显示器有反应,主板接的显示器没放映...

热门文章

  1. bzoj2749: [HAOI2012]外星人
  2. 姓氏头像框一键制作小程序源码+附微语模块
  3. 【数据结构】set重载 < 运算符
  4. 2019年互联网最高薪的25大职位,排第一竟是....
  5. SpringBoot+Kafka+ELK 完成海量日志收集(超详细)
  6. 【EOS钱包开发 一】EOS不得不说的一些概念
  7. 电销机器人帮助你提高工作效率
  8. 浅谈session实现原理(阿里面试题)
  9. 2023湖北大学计算机考研信息汇总
  10. 抖音直播间我打的字别人看不见,抖音直播打字看不见怎么回事