文档章节

7-pandas分组计算

eddy_linux
 eddy_linux
发布于 2017/09/06 10:37
字数 1219
阅读 70
收藏 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

'''

 

上一篇: 8-pandas聚合运算
下一篇: 6-pandas索引
eddy_linux
粉丝 22
博文 135
码字总数 188789
作品 0
成都
程序员
私信 提问
加载中
请先登录后再评论。
桌面即时贴软件--GloboNote

GloboNote 是一个桌面记事软件,可帮你创建待办事宜、提醒和其他笔记信息。无限制即时贴的数量,可分组整理,支持搜索,可定制文本的显示格式(字体、颜色和大小),可将某个即时贴始终显示在...

匿名
2013/01/21
6.8K
1
C++科学计算库--O2scl

一个面向对象的 C++科学计算库,可用于解方程,最小化,微分,积分,插值,优化,逼近,分析,拟合等。许多类可操作于通用的函数和向量类型。可用于O2scl在Linux,Mac和Windows(Cygwin的)平...

匿名
2012/10/29
4.7K
0
Python数据分析工具包--Pandas

Python Data Analysis Library 或 pandas 是连接 SciPy 和 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集...

匿名
2012/10/30
2.1W
2
最短路径计算--A-STAR

A-STAR 寻找一种静态路网(本算法中为二维数组)中求解最短路径的解决办法 我们可以通过: var element = new Element(); 来创建二维数组的一个节点。 element自身包含了一些方法: element....

前叔
2012/12/14
1.8K
0
计算资源管理平台--Apache VCL

Apache VCL 是一个自服务的系统,为最终用户提供专用计算环境的远程访问环境。典型的使用场景是数据中心,也可以是物理刀片服务器、传统机架服务器或者虚拟机。VCL 也可以提供独立机器的代理...

匿名
2013/01/04
2.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

获取JavaScript数组中的所有唯一值(删除重复项) - Get all unique values in a JavaScript array (remove duplicates)

问题: I have an array of numbers that I need to make sure are unique. 我需要确定一个唯一的数字数组。 I found the code snippet below on the internet and it works great until th......

javail
今天
11
0
如何检查字符串是否为空? - How to check if the string is empty?

问题: Does Python have something like an empty string variable where you can do: Python是否有类似空字符串变量的内容可以在其中执行: if myString == string.empty: Regardless, wh......

富含淀粉
今天
19
0
您如何存储未跟踪的文件? - How do you stash an untracked file?

问题: I have changes to a file, plus a new file, and would like to use git stash to put them away while I switch to another task. 我对一个文件进行了更改,再加上一个新文件,并希......

技术盛宴
今天
39
0
GeoPandas入门 | 01-地理数据介绍

01-地理数据介绍 1.1 Python地理空间矢量数据简介 %matplotlib inlineimport pandas as pdimport geopandas 导入地理数据 地理空间数据通常可以从特定的GIS文件格式或数据存储中获得,如...

酱肉包-
今天
25
0
OSChina 周三乱弹 —— 我是不是也有王室血统

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @小小编辑推荐,《我们》- 陈奕迅 《我们》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @举个栗子OSC :快抬头看天!!! 雨后还有彩虹...

小小编辑
今天
59
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部