python中分组函数groupby和分组运算函数agg的使用

目录
  • groupby:
  • agg:

今天来介绍pandas中一个很有用的函数groupby,其实和hive中的groupby的效果是一样的,区别在于两种语言的写法问题。groupby在Python中的分组统计中很有用~

groupby:

首先创建数据:

import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'],
                       'B': [2, 7, 1, 3, 3, 2, 4, 8],
                       'C': [100, 87, 96, 130, 105, 87, 96, 155]})
df
Out[2]:
   A  B    C
0  a  2  100
1  b  7   87
2  a  1   96
3  c  3  130
4  a  3  105
5  c  2   87
6  b  4   96

pandas中groupby的基本操作:

1、按A列进行分组,求B、C两列的均值:

df.groupby('A').mean()
Out[6]:
          B           C
A
a  2.000000  100.333333
b  5.500000   91.500000
c  4.333333  124.000000

当然也可以按照多列进行分组,获取其他列的均值:

df.groupby(['A','B']).mean()
Out[7]:
       C
A B
a 1   96
  2  100
  3  105
b 4   96
  7   87
c 2   87
  3  130
  8  155

2、分组后,选择列进行计算:

data=df.groupby('A')
data['B'].std()
Out[11]:
A
a    1.00000
b    2.12132
c    3.21455
Name: B, dtype: float64

#选择B、C两列
data['B','C'].mean()
Out[12]:
          B           C
A
a  2.000000  100.333333
b  5.500000   91.500000
c  4.333333  124.000000

3、按A进行分组后,可以对不同的列采用不同的聚合方法(ps:这一点就和hive很相像了)

data.agg({'B':'mean','C':'sum'})    #B列均值,C列汇总
Out[14]:
     C         B
A
a  301  2.000000
b  183  5.500000
c  372  4.333333

4、如果按照A进行分组后,对多列采用相同的聚合方法,我们可以借助apply函数:

df.groupby('A').apply(np.mean)
Out[25]:
          B           C
A
a  2.000000  100.333333
b  5.500000   91.500000
c  4.333333  124.000000

5、将某列数据按数据值分成不同范围段进行分组运算

创建数据集:

np.random.seed(0)
df = pd.DataFrame({'Age': np.random.randint(20, 70, 100),
                        'Sex': np.random.choice(['Male', 'Female'], 100),
                        'number_of_foo': np.random.randint(1, 20, 100)})
Out[38]:
   Age     Sex  number_of_foo
0   64  Female             14
1   67  Female             14
2   20  Female             12
3   23    Male             17
4   23  Female             15

目标:将age字段分成三组,有如下两种方法实现:

#第一种方法:
1、bins=4
pd.cut(df['Age'], bins=4)
0       (56.75, 69.0]
1       (56.75, 69.0]
2     (19.951, 32.25]
3     (19.951, 32.25]
4     (19.951, 32.25]...

#第二种方法
2、bins=[19, 40, 65, np.inf]
pd.cut(df['Age'], bins=[19,40,65,np.inf])
Out[40]:
0     (40.0, 65.0]
1      (65.0, inf]
2     (19.0, 40.0]
3     (19.0, 40.0]
4     (19.0, 40.0]

#分组范围结果如下:
age_groups = pd.cut(df['Age'], bins=[19,40,65,np.inf])
df.groupby(age_groups).mean()
Out[43]:
                    Age  number_of_foo
Age
(19.0, 40.0]  29.840000       9.880000
(40.0, 65.0]  52.833333       9.452381
(65.0, inf]   67.375000       9.250000

#按‘Age'分组范围和性别(sex)进行制作交叉表

pd.crosstab(age_groups, df['Sex'])
Out[44]:
Sex           Female  Male
Age
(19.0, 40.0]      22    28
(40.0, 65.0]      18    24
(65.0, inf]        3     5

agg:

1、使用groupby按照某列(A)进行分组后,需要对另外一列采用不同的聚合方法:

df.groupby('A')['B'].agg({'mean':np.mean, 'std': np.std})

Out[16]:
       std      mean
A
a  1.00000  2.000000
b  2.12132  5.500000
c  3.21455  4.333333

2、按照某列进行分组后,对不同的列采用不同的聚合方法:

df.groupby('A').agg({'B':[np.mean,'sum'],'C':['count',np.std]})  #[]中对应的是两种方法

Out[17]:
      C                    B
  count        std      mean sum
A
a     3   4.509250  2.000000   6
b     2   6.363961  5.500000  11
c     3  34.394767  4.333333  13

transform:

前面两种方法得到的结果是以A列值为索引的结果,如果使用没有进行groupby分组的index的话,该怎么操作呢?此时就要用到transform函数了。transform(func, args, *kwargs) 方法简化了这个过程,: func 参数应用到所有分组,然后把结果放置到原数组的 index 上:

df
Out[31]:
   A  B    C
0  a  2  100
1  b  7   87
2  a  1   96
3  c  3  130
4  a  3  105
5  c  2   87
6  b  4   96
7  c  8  155

df.groupby('A')['B','C'].transform('count')  #注:count函数在计算时,不计算nan值
Out[32]:
   B  C
0  3  3
1  2  2
2  3  3
3  3  3
4  3  3
5  3  3
6  2  2
7  3  3

从中可以看出:按A列进行分组,对B、C两列进行计数时,B为a的索引有[0,2,4],所以结果列的中[0,2,4]索引的值都为3,相当于广播了。对于C列,同理。

到此这篇关于python中分组函数groupby和分组运算函数agg的使用的文章就介绍到这了,更多相关python 分组函数groupby和分组运算函数agg内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 列表映射后的平均值

    目录 1.average_by 2.lambda表达式 3.map函数 4.其他类似函数 4.1 max_by 4.2 min_by 4.3 sum_by 本篇阅读的代码片段来自于30-seconds-of-python. 1.average_by def average_by(lst, fn=lambda x: x): return sum(map(fn, lst), 0.0) / len(lst) # EXAMPLES average_by([{ 'n': 4 }, { 'n': 2 },

  • Python 实现过滤掉列表中唯一值

    目录 1.filter_unique 2.collections.Counter 3.列表推导式 4.filter_non_unique 1.filter_unique from collections import Counter def filter_unique(lst): return [item for item, count in Counter(lst).items() if count > 1] # EXAMPLES filter_unique([1, 2, 2, 3, 4, 4

  • Python列表推导式详情

    目录 1.列表生成式 1.1 案例 2.集合生成式 3.字典生成式 1.列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 语法结构如下: # 普通的生成式 [表达式 for 变量 in 旧列表] # 加条件的生成式 [表达式 for 变量 in 旧列表 if 条件] # if...else条件的生成式 [表达式 if 条件1 else 条件2for 变量 in 旧列表] 1.1 案例 过滤掉名词字母不足4的名字,示

  • Python 代码实现列表的最小公倍数

    目录 1. lcm 2. functools.reduce 3. 实际使用 本篇阅读的代码片段来自于30-seconds-of-python(https://github.com/30-seconds...). 1. lcm from functools import reduce from math import gcd def lcm(numbers): return reduce((lambda x, y: int(x * y / gcd(x, y))), numbers) # EXAMP

  • Python根据过滤器拆分列表

    目录 1. bifurcate 2. enumerate 3. 列表推导式 1. bifurcate def bifurcate(lst, filter): return [ [x for i, x in enumerate(lst) if filter[i] == True], [x for i, x in enumerate(lst) if filter[i] == False] ] # EXAMPLES bifurcate(['beep', 'boop', 'foo', 'bar'], [

  • Python 数字转化成列表详情

    目录 1. digitize 2. Python判断对象是否可迭代 本篇阅读的代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项. 本篇阅读的代码片段来自于30-seconds-of-python. 1. digitize def digitize(n): return list(map(int, str(n))) # EXAMPLES digitize(123) # [1, 2, 3] 该函数的主体逻辑是先将输入的数字转化成字符串,再使用map函数将字符

  • 使用python对视频文件分辨率进行分组的实例代码

    在平时的工作中,我们的目录有很多的视频文件,如果你没有一个好的视频分类习惯,在找视频素材的时候会很费时,通过对视频的分辨路进行分类可以在需要的时候快速找到你想要的视频分辨率.当然人工去分类是一种比较费时费力的工作,通过软件也好,程序也罢都是为了可以提高我们的工作效率. 代码分享 import os import subprocess import json import shutil import datetime def get_files(file_dir): for root, dirs,

  • Python代码实现列表分组计数

    目录 1. count_by 2. 使用字典推导式 3. 使用collections.defaultdict简化代码 本篇阅读的代码片段来自于30-seconds-of-python. 1. count_by def count_by(arr, fn=lambda x: x): key = {} for el in map(fn, arr): key[el] = 1 if el not in key else key[el] + 1 return key # EXAMPLES from math

  • python中分组函数groupby和分组运算函数agg的使用

    目录 groupby: agg: 今天来介绍pandas中一个很有用的函数groupby,其实和hive中的groupby的效果是一样的,区别在于两种语言的写法问题.groupby在Python中的分组统计中很有用~ groupby: 首先创建数据: import pandas as pd import numpy as np df = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'], 'B': [2, 7, 1, 3, 3

  • Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符串常用的几种字符串内置函数(本文中牵扯到了模块与一些之前章节没讲过的相关知识,坑我之后会填的) 字符串切片(截取字符串): #字符串切片 string[开始位置:结束位置:步长] name = "巩祎鹏"print(name[0:]) #从第一个字符截取到最后一个字符 print(name[0:2]) #从第一个字符截取到第二个字符 prin

  • 对python中的os.getpid()和os.fork()函数详解

    如下所示: import os import sys import time processNmae = 'parent' print "Program executing ntpid:%d,processNmae:%s"%(os.gitpid(),processNmae) #attempt to fork child process try: forkPid = os.fork() except OSError: sys.exit("Unable to create new

  • 在Python中画图(基于Jupyter notebook的魔法函数)

    这篇文章主要介绍了在Python中画图(基于Jupyter notebook的魔法函数),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先展示一段相关的代码: #we test the accuracy of knn and find the k which makes the biggest accuracy k_range=list(range(1,26))#[1,25] scores=[] for k in k_range: knn=KN

  • 在python中利用最小二乘拟合二次抛物线函数的方法

    1.最小二乘也可以拟合二次函数 我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的.下面我们就来试试用最小二乘来拟合抛物线形状的的图像. 对于二次函数来说,一般形状为 f(x) = a*x*x+b*x+c,其中a,b,c为三个我们需要求解的参数.为了确定a.b.c,我们需要根据给定的样本,然后通过调整这些参数,知道最后找出一组参数a.b.c,使这些所有的样本点距离f(x)的距离平方和最小.用什么方法来调整这些参数呢?最常见的自然就是我们的梯度下降

  • 对python中的six.moves模块的下载函数urlretrieve详解

    实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu) 函数介绍:所用函数为six.moves下的urllib中的函数,调用如下urllib.request.urlretrieve(url,[filepath,[recall_func,[data]]]).简单介绍一下,url是必填的指的是下载地址,filepath指的是保存的本地地址,recall_func指的是回调函数,下载过程中会调用可以用来显示下载进度. 实验代码:以下载cifa

  • 如何在python中实现capl语言里的回调函数(推荐)

    CAPL:回调函数 CAPL是一种程序语言,其中程序块的执行由事件控制. 这些程序块被称为事件程序.在事件程序中定义的程序代码在事件发生时执行.换句话说,事件程序就是事件函数,当事件函数关联的事件被触发时,会自动执行此事件函数函数体.事件函数也称为回调函数 事件函数的标志就是关键字on,比如: on key 表示当键盘按下小写字母a时触发此事件函数执行 on message 表示当接收到消息时触发此事件函数执行 on start 表示当canoe软件运行时触发此事件函数执行 on sysvar

  • Python中非常实用的一些功能和函数分享

    在使用Python多年以后,我偶然发现了一些我们过去不知道的功能和特性.一些可以说是非常有用,但却没有充分利用.考虑到这一点,我编辑了一些你应该了解的Python功能特色. 带任意数量参数的函数 你可能已经知道了Python允许你定义可选参数.但还有一个方法,可以定义函数任意数量的参数. 首先,看下面是一个只定义可选参数的例子 复制代码 代码如下: def function(arg1="",arg2=""):     print "arg1: {0}&qu

  • Python中非常好用的内置函数详解

    目录 Counter 举例 实战 sorted all F-strings 总结 Python中冷门但非常好用的内置函数 Counter举例 实战sortedallF-strings Python中有许多内置函数,不像print.len那么广为人知,但它们的功能却异常强大,用好了可以大大提高代码效率,同时提升代码的简洁度,增强可阅读性 Counter collections在python官方文档中的解释是High-performance container datatypes,直接的中文翻译解释

  • Python中10个常用的内置函数详解

    目录 complex() dir() divmod(a,b) enumerate(iterable,start=0) eval(expression,globals,locals) filter(function,iterable) isinstance(object,classinfo) map(function,iterable,-) input() zip(*iteables) 总结 complex() 返回一个形如 a+bj 的复数,传入参数分为三种情况: 参数为空时,返回0j 参数为字

随机推荐