文档章节

8-pandas聚合运算

eddy_linux
 eddy_linux
发布于 2017/09/06 11:25
字数 1260
阅读 25
收藏 0
点赞 0
评论 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      1      8    a  one
1      7      5    a  two
2      1      6    b  one
3      9      7    b  two
4      5      4    a  one
'''

#内置聚合函数
#求和
print(df.groupby('key1').sum())
'''
      data1  data2
key1
a        21     19
b         6      4
'''
#求平均值
print(df.groupby('key1').mean())
'''
         data1  data2
key1
a     3.333333    5.0
b     3.500000    4.0
'''
#求最小值
print(df.groupby('key1').min())
'''
      data1  data2 key2
key1
a         1      3  one
b         4      1  one
'''
#求最大值
print(df.groupby('key1').max())
'''
      data1  data2 key2
key1
a         9      9  two
b         4      4  two
'''
#展示一些列的聚合运算结果
print(df.groupby('key1').describe())
'''
               data1     data2
key1
a    count  3.000000  3.000000
     mean   4.666667  5.333333
     std    0.577350  2.081666
     min    4.000000  3.000000
     25%    4.500000  4.500000
     50%    5.000000  6.000000
     75%    5.000000  6.500000
     max    5.000000  7.000000

b    count  2.000000  2.000000
     mean   6.500000  8.500000
     std    3.535534  0.707107
     min    4.000000  8.000000
     25%    5.250000  8.250000
     50%    6.500000  8.500000
     75%    7.750000  8.750000
     max    9.000000  9.000000
'''

#自定义聚合函数
grouped = df.groupby('key1')

#聚合结果最大值减去最小值
def peak_range(s):
    return s.max() - s.min()
print(df)
print(grouped.agg(peak_range))
'''
   data1  data2 key1 key2
0      7      2    a  one
1      2      8    a  two
2      7      8    b  one
3      7      2    b  two
4      1      7    a  one
      data1  data2
key1
a         6      6
b         0      6

'''
#还可以传如多个聚合函数进行聚合运算
print(grouped.agg(['std','mean','sum',peak_range]))
'''
         data1                         data2
           std mean sum peak_range       std      mean sum peak_range
key1
a     1.732051  5.0  15          3  2.516611  6.666667  20          5
b     2.121320  2.5   5          3  2.121320  2.500000   5          3
'''
print(grouped.agg(['std','mean','sum',('range',peak_range)]))
'''
         data1                         data2
           std      mean sum range       std      mean sum range
key1
a     3.785939  3.666667  11     7  2.081666  7.333333  22     4
b     1.414214  5.000000  10     2  0.707107  1.500000   3     1
'''
#不同的列使用不同的聚合函数
d = {'data1':'mean','data2':'sum'}

print(grouped.agg(d))
'''
      data1  data2
key1
a       5.0     19
b       5.5     17
'''
d = {'data1':['mean','sum'],'data2':['sum',('range',peak_range)]}
print(grouped.agg(d))
'''
     data2           data1
       sum range      mean sum
key1
a       14     7  5.333333  16
b        9     5  5.500000  11
'''
print(grouped.agg(d).reset_index())
'''
  key1 data2       data1
         sum range  mean sum
0    a    16     7     7  21
1    b    15     3     5  10
'''
#高级应用
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),
    }
)
k1_mean = df.groupby('key1').mean()
print(k1_mean)
'''
      data1     data2
key1
a       5.0  3.333333
b       4.0  8.500000
'''
#首先修改聚合之后的列显示名称
k1_mean = df.groupby('key1').mean().add_prefix('mean_')
print(k1_mean)
'''
      mean_data1  mean_data2
key1
a       7.666667         6.0
b       8.000000         5.0
'''
#使用合并函数
print(pd.merge(df,k1_mean,left_on='key1',right_index=True))
'''
   data1  data2 key1 key2  mean_data1  mean_data2
0      5      7    a  one         4.0    6.666667
1      2      8    a  two         4.0    6.666667
4      5      5    a  one         4.0    6.666667
2      6      8    b  one         7.5    8.000000
3      9      8    b  two         7.5    8.000000
'''
#另外的方式
k1_mean = df.groupby('key1').transform(np.mean).add_prefix('mean_')
print(k1_mean)
'''
   mean_data1  mean_data2
0    6.666667         7.0
1    6.666667         7.0
2    5.500000         3.5
3    5.500000         3.5
4    6.666667         7.0
'''
#合并
df[k1_mean.columns] = k1_mean
print(df)
'''
   data1  data2 key1 key2  mean_data1  mean_data2
0      9      3    a  one           7    1.666667
1      7      1    a  two           7    1.666667
2      7      5    b  one           7    6.500000
3      7      8    b  two           7    6.500000
4      5      1    a  one           7    1.666667
'''

df = pd.DataFrame(
    np.random.randint(1,10,(5,5)),
    columns=list('abcde'),
    index=['Alice','Bob','Candy','Dark','Emily']
)
print(df)
'''
       a  b  c  d  e
Alice  8  1  4  8  1
Bob    6  8  2  7  1
Candy  3  2  3  2  6
Dark   8  9  2  9  8
Emily  7  9  6  3  4
'''

def demean(s):
    return s - s.mean()
key = ['one','one','two','one','two']
demeaned = df.groupby(key).transform(demean)
print(demeaned)
'''
         a    b    c         d    e
Alice  1.0 -1.0 -3.0  0.666667  2.0
Bob    2.0  0.0  0.0  1.666667 -3.0
Candy -2.5  3.0  1.5  0.500000 -0.5
Dark  -3.0  1.0  3.0 -2.333333  1.0
Emily  2.5 -3.0 -1.5 -0.500000  0.5
'''
#误差
print(demeaned.groupby(key).mean())
'''
                a             b             c    d    e
one  2.960595e-16  2.960595e-16  2.960595e-16  0.0  0.0
two  0.000000e+00  0.000000e+00  0.000000e+00  0.0  0.0
'''

#输出某一列排序的最大的前两行
df = pd.DataFrame(
    {
        'key1':['a','a','b','b','a','a','a','b','b','a'],
        'key2':['one','two','one','two','one','one','two','one','two','one'],
        'data1':np.random.randint(1,10,10),
        'data2':np.random.randint(1,10,10),
    }
)
print(df)
'''
   data1  data2 key1 key2
0      1      2    a  one
1      5      8    a  two
2      7      9    b  one
3      8      3    b  two
4      9      8    a  one
5      7      8    a  one
6      6      7    a  two
7      2      7    b  one
8      7      8    b  two
9      4      4    a  one

'''
def top(g,n=2,column='data1'):
    return g.sort_values(by=column,ascending=False)[:n]

print(df)
print(top(df))
print(top(df,n=3))
'''
   data1  data2 key1 key2
0      1      4    a  one
1      3      5    a  two
2      1      6    b  one
3      8      7    b  two
4      7      7    a  one
5      6      4    a  one
6      4      1    a  two
7      4      8    b  one
8      4      3    b  two
9      6      4    a  one

   data1  data2 key1 key2
3      8      7    b  two
4      7      7    a  one

   data1  data2 key1 key2
3      8      7    b  two
4      7      7    a  one
5      6      4    a  one

'''
print(df)
print(df.groupby('key1').apply(top))
'''
   data1  data2 key1 key2
0      5      9    a  one
1      5      2    a  two
2      4      9    b  one
3      9      3    b  two
4      3      1    a  one
5      7      5    a  one
6      3      4    a  two
7      4      3    b  one
8      4      6    b  two
9      9      6    a  one
        data1  data2 key1 key2
key1
a    9      9      6    a  one
     5      7      5    a  one
b    3      9      3    b  two
     2      4      9    b  one
'''

#对于Nan值采用分组的平均值进行填充
states = [
    '成都','贵州','重庆','西藏',
    '广州','杭州','福州','海南'
]
group_key = ['East'] * 4 + ['West'] * 4
data = pd.Series(np.random.randn(8),index=states)
data[['重庆','福州','海南']]=np.NaN
print(data)
'''
成都   -0.415079
贵州    0.276800
重庆         NaN
西藏    0.112333
广州   -1.029535
杭州    2.415340
福州         NaN
海南         NaN
'''
print(data.groupby(group_key).mean())
'''
East    1.641739
West   -0.894022
'''
def fill_mean(g):
    return g.fillna(g.mean())

print(data.groupby(group_key).apply(fill_mean))
'''
成都   -0.171079
贵州    0.577168
重庆   -0.355028
西藏   -1.471175
广州   -0.149200
杭州    0.193913
福州    0.022356
海南    0.022356
'''






 

© 著作权归作者所有

共有 人打赏支持
eddy_linux
粉丝 18
博文 135
码字总数 188789
作品 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

数据聚合与分组运算——GroupBy

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

Betty__ ⋅ 2016/10/03 ⋅ 0

pandas 数据分组运算

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

lionets ⋅ 2014/06/16 ⋅ 2

python/pandas数据挖掘(十四)-groupby,聚合,分组级运算

groupby 以上的分组键均为Series,实际上分组键可以是任何长度适当的数组 可以看出没有key2列,因为df[‘key2’]不是数值数据,所以被从结果中移除。默认情况下,所有数值列都会被聚合,虽然...

youngbit007 ⋅ 2017/01/09 ⋅ 0

Pandas初学者代码优化指南

原文:A Beginner’s Guide to Optimizing Pandas Code for Speed 作者:Sofia Heisler 翻译:无阻我飞扬 摘要:Pandas 是Python Data Analysis Library的简写,它是为了解决数据分析任务而创...

dev_csdn ⋅ 2017/11/21 ⋅ 0

10分钟入门Pandas

参考: 10 Minutes to pandas 安装 支持的python版本: 2.7, 3.5, 3.6 检查本地的pandas运行环境是否完整,可以运行pandas的单元测试用例 获取当前使用pandas的版本信息 概览 pandas的基本数据...

宁静的夜 ⋅ 2017/12/20 ⋅ 0

Pandas模块入门(一)——Series结构介绍

Pandas模块是Python用于数据导入及整理的模块,对数据挖掘前期数据的处理工作十分有用,因此这些基础的东西还是要好好的学学。 Pandas模块的数据结构主要有两:1、Series ;2、DataFrame 这次...

qq_36332685 ⋅ 2017/12/13 ⋅ 0

机器学习Pandas入门

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

木子昭 ⋅ 01/01 ⋅ 0

7.python数据分析与展示------Pandas库入门

1.Pandas库的介绍 Pandas是Python第三方库,提供高性能易用数据类型和分析工具 import pandas as pd Pandas基于Numpy实现,常与Numpy和Matplotlib一同使用 import pandas as pd d =pd.Series...

bxg1065283526 ⋅ 04/29 ⋅ 0

pandasql:让 python 运行 SQL

pandasql:让 python 运行 SQL pandasql:让 python 运行 SQL 由 Yhat | 2016 年 10 月 11 日 本文链接:http://blog.yhat.com/posts/pandasql-intro.html 介绍 关于 Python 的最喜欢的一件事......

Datartisan ⋅ 2017/09/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部