文档章节

7-pandas分组计算

eddy_linux
 eddy_linux
发布于 2017/09/06 10:37
字数 1219
阅读 8
收藏 0
点赞 1
评论 0
#encoding:utf8


import numpy as np
import pandas as pd


'''
分组计算:
    拆分:根据什么进行分组
    应用:每个分组进行怎样的计算
    合并:每个分组的计算结果合并起来
'''

df = pd.DataFrame(
    {
        'key1':['a','a','b','b','a'],
        'key2':['one','two','one','two','one'],
        'data1':np.random.randint(1,10,5),
        'data2':np.random.randint(1,10,5),
    }
)
print(df)
'''
   data1  data2 key1 key2
0      3      9    a  one
1      3      5    a  two
2      7      3    b  one
3      1      1    b  two
4      2      1    a  one
'''
print(df['data1'])
'''
0    7
1    7
2    4
3    1
4    8
'''
#计算data1列按照key1字段聚合求平均值
print(df['data1'].groupby(df['key1']).mean())
'''
   data1  data2 key1 key2
0      1      3    a  one
1      4      4    a  two
2      3      9    b  one
3      7      3    b  two
4      1      3    a  one

key1
a    2
b    5
'''
#除了可以在数据内按照聚合,也可以自定义聚合
#这里列表中元素表示data1列的元素位置聚合
#data1列下的第1,3,4个元素聚合,第2,5个元素聚合,然后求平均值
key = [1,2,1,1,2]
print(df)
print(df['data1'].groupby(key).mean())
'''
   data1  data2 key1 key2
0      9      9    a  one
1      5      2    a  two
2      4      8    b  one
3      2      4    b  two
4      1      3    a  one

1    5
2    3
'''

#分组也可以是多级列表
#在groupby中按照元素索引顺序进行排组的依据先后
print(df)
print(df['data1'].groupby([df['key1'],df['key2']]).sum())
print(df['data1'].groupby([df['key2'],df['key1']]).sum())
'''
   data1  data2 key1 key2
0      9      8    a  one
1      3      4    a  two
2      7      8    b  one
3      4      1    b  two
4      3      7    a  one
a[9,3,3]---->one[9,3]....

key1  key2
a     one     12
      two      3
b     one      7
      two      4

one[9,7,3]---->a[9,3]....
key2  key1
one   a       12
      b        7
two   a        3
      b        4
'''

#查看分组的个数
print(df['data1'].groupby([df['key1'],df['key2']]).size())
'''
key1  key2
a     one     2
      two     1
b     one     1
      two     1
'''

#按照key1进行分组
#生成的是一个DataFrame
print(df.groupby('key1').sum())
'''
      data1  data2
key1
a        16     12
b        10      6
'''
#对分组之后可进行索引的选取
print(df.groupby('key1').sum()['data1'])
'''
key1
a    14
b    15
'''
#当然也可以进行多级分组,然后转换为DataFrame
mean = df.groupby(['key1','key2']).sum()
print(mean)
print(mean.unstack())
'''
           data1  data2
key1 key2
a    one      17      6
     two       1      3
b    one       7      3
     two       1      6

     data1     data2
key2   one two   one two
key1
a       17   1     6   3
b        7   1     3   6
'''
#groupby支持迭代
for name,group in df.groupby('key1'):
    print(name)
    print(group)
'''
a
   data1  data2 key1 key2
0      9      8    a  one
1      8      8    a  two
4      7      7    a  one

b
   data1  data2 key1 key2
2      6      1    b  one
3      5      8    b  two
'''
#也可以对groupby转换为字典
print(dict(list(df.groupby('key1'))))
print(dict(list(df.groupby('key1')))['a'])
print(dict(list(df.groupby('key1')))['b'])
'''
{'a':    data1  data2 key1 key2
0      9      4    a  one
1      4      3    a  two
4      5      6    a  one, 'b':    data1  data2 key1 key2
2      3      7    b  one
3      2      8    b  two}

   data1  data2 key1 key2
0      9      4    a  one
1      4      3    a  two
4      5      6    a  one

   data1  data2 key1 key2
2      3      7    b  one
3      2      8    b  two
'''
#按照列类型进行分组
print(df.groupby(df.dtypes,axis=1).sum())
'''
0      4   aone
1     15   atwo
2     10   bone
3      8   btwo
4     18   aone
'''

#以上都是按照列表进行分组
#下面用其他分组形式来进行分组
#通过字典进行分组
df = pd.DataFrame(
    np.random.randint(1,10,(5,5)),
    columns=list('abcde'),
    index=['Alice','Bob','Candy','Dark','Emily']
)
#看一下处理非数字
df.ix[1,1:3] = np.NaN
print(df)
'''
       a    b    c  d  e
Alice  3  3.0  7.0  7  9
Bob    4  NaN  NaN  3  4
Candy  9  5.0  1.0  4  1
Dark   6  3.0  9.0  9  9
Emily  8  4.0  2.0  3  6
'''
mapping = {
    'a':'red',
    'b':'red',
    'c':'blue',
    'd':'orange',
    'e':'blue'
}
grouped = df.groupby(mapping,axis=1)
print(grouped.sum())
'''
       a    b    c  d  e
Alice  4  5.0  2.0  2  2
Bob    3  NaN  NaN  8  1
Candy  6  7.0  6.0  9  7
Dark   7  8.0  1.0  4  3
Emily  8  6.0  8.0  3  3

       blue  orange   red
Alice   4.0     2.0   9.0
Bob     1.0     8.0   3.0
Candy  13.0     9.0  13.0
Dark    4.0     4.0  15.0
Emily  11.0     3.0  14.0
可以看对Nan和数字分组计算是按照Nan=0来处理的
'''
print(grouped.size())
print(grouped.count())
'''
blue      2
orange    1
red       2

       blue  orange  red
Alice     2       1    2
Bob       1       1    1
Candy     2       1    2
Dark      2       1    2
Emily     2       1    2
Nan是没有统计个数的
'''


#通过函数进行分组
df = pd.DataFrame(
    np.random.randint(1,10,(5,5)),
    columns=list('abcde'),
    index=['Alice','Bob','Candy','Dark','Emily']
)
#按照行索引
def _group_by(idx):
    print(idx)
    return idx
print(df.groupby(_group_by).size())
print(df.groupby(_group_by).count())
'''
Alice
Bob
Candy
Dark
Emily
       a  b  c  d  e
Alice  1  1  1  1  1
Bob    1  1  1  1  1
Candy  1  1  1  1  1
Dark   1  1  1  1  1
Emily  1  1  1  1  1
按照行来进行分组的
'''
#按照行索引长度
def _group_by2(idx):
    print(idx)
    return len(idx)
print(df.groupby(_group_by2).size())
print(df.groupby(_group_by2).count())
'''
Alice
Bob
Candy
Dark
Emily

   a  b  c  d  e
3  1  1  1  1  1
4  1  1  1  1  1
5  3  3  3  3  3
'''


#通过索引级别进行分组
columns = pd.MultiIndex.from_arrays(
    [
        ['China','USA','China','USA','China'],
        ['A','A','B','C','B']
    ],
    names=['country','index']
)
df = pd.DataFrame(np.random.randint(1,10,(5,5)),columns=columns)
print(df)
'''
country China USA China USA China
index       A   A     B   C     B
0           9   5     4   5     2
1           8   5     4   6     9
2           2   7     3   1     3
3           2   1     6   5     5
4           5   3     6   9     4
'''
print(df.groupby(level='country',axis=1).sum())
'''
country  China  USA
0           17   12
1           19   12
2           19    8
3           21   13
4           18    9
'''
print(df.groupby(level='index',axis=1).sum())
'''
index   A   B  C
0       7   7  6
1      11  12  3
2      12  11  9
3      14  11  4
4      17  15  8

'''

 

© 著作权归作者所有

共有 人打赏支持
eddy_linux
粉丝 18
博文 135
码字总数 188789
作品 0
成都
程序员
数据聚合与分组运算——GroupBy

pandas提供了一个灵活高效的groupby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。 根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象。 计算分组摘...

Betty__ ⋅ 2016/10/03 ⋅ 0

python数据分析及处理案例技巧11-20(基于jupyter)

案例11:cut函数与数据分组 1)cut的用法 设置包含最小值, 不包括左,包括右,可用right = False包括左,不包括右 显示成组别格式 数值统计: 还可以不指定面元的界限,直接传入一个整数参数...

pbgc396dwxjb77f2je ⋅ 2017/12/07 ⋅ 0

(转载)Python数据分析之pandas学习

转载地址:http://www.cnblogs.com/nxld/p/6058591.html Python中的pandas模块进行数据分析。 接下来pandas介绍中将学习到如下8块内容: 1、数据结构简介:DataFrame和Series 2、数据索引ind...

fjssharpsword ⋅ 2017/11/28 ⋅ 0

利用Python分析学校四六级过关情况。

这段时间看了数据分析方面的内容,对Python中的numpy和pandas有了最基础的了解。我知道如果我不用这些技能做些什么的话,很快我就会忘记。想起之前群里发过一个学校的四六级成绩表,正好可以...

Leafage_M ⋅ 2017/11/17 ⋅ 0

机器学习Pandas入门

pandas Pandas是基于Numpy开发出的,专门用于数据分析的开源Python库 Pandas的两大核心数据结构 Series(一维数据) Series 创建Series的方法 允许索引重复 DataFrame(多特征数据,既有行索引,又...

木子昭 ⋅ 01/01 ⋅ 0

如何用 Python 执行常见的 Excel 和 SQL 任务

作者:ROGER HUANG 本文转载自:http://code-love.com/2017/04/30/excel-sql-python/ 本教程的代码和数据可在 Github 资源库 中找到。有关如何使用 Github 的更多信息,请参阅本指南。 数据从...

Datartisan ⋅ 2017/07/20 ⋅ 0

利用 Pandas 来分析 MovieLens 数据集

为了展现 Pandas 的实用性,本文将利用 Pandas 来解决 MovieLen 数据集的一些问题。我们首先回顾下如何将数据集读进 DataFrame 中并将其合并: 评价最多的 25 部电影 上述代码的含义是先将 ...

Datartisan数据工匠 ⋅ 2016/06/30 ⋅ 0

PySpark SQL常用语法

许多数据分析师都是用HIVE SQL跑数,这里我建议转向PySpark: PySpark的语法是从左到右串行的,便于阅读、理解和修正;SQL的语法是从内到外嵌套的,不方便维护; PySpark继承Python优美、简洁...

真依然很拉风 ⋅ 05/14 ⋅ 0

pandas 数据分组运算

GroupBy ---分组运算有时也被称为 “split-apply-combine” 操作。其中的 “split” 便是借由 方法来实现的。 方法作用于一条轴向上,并接受一个分组键(by)参数来给调用者分组。分组键可以...

lionets ⋅ 2014/06/16 ⋅ 2

Pandas使用DataFrame进行数据分析比赛进阶之路(一)

这篇文章中使用的数据集是一个足球球员各项技能及其身价的csv表,包含了60多个字段。数据集下载链接:数据集 1、DataFrame.info() 这个函数可以输出读入表格的一些具体信息。这对于加快数据预...

大黄有故事 ⋅ 03/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 17分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 40分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 42分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 49分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部