首页 > 其他分享 >数据的分组与计算

数据的分组与计算

时间:2022-11-12 14:31:17浏览次数:50  
标签:Lakers Bulls 分组 PG 计算 Team 数据 SF

对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在数据集准备好之后,通常就是计算分组统计或生成透视表。pandas 提供了一个灵活高效的 groupby 功能,使我们可以高效地对数据集进行操作。

关系型数据库和 SQL 能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像 SQL 这样的查询语言所能执行的分组运算的种类很有限,而由于 pandas 强大的表达能力,我们可以执行复杂得多的分组运算。

1. 分组

分组操作分为拆分、应用和合并三个阶段。第一个阶段,根据一个或多个键将 pandas 对象中的数据拆分为多组。第二个阶段,将一个函数应用到各个分组并产生一个新值。第三个阶段,将所有函数的执行结果合并到最终的结果对象中。

数据的分组与计算_数据集

1.1 按单个关键字进行分组

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby("Team")
print(gk.groups)

上述代码中,首先按照 Team 对 df 进行分组,然后通过 groups 属性获取到所有的分组。从输出结果可以看出,第 1、2、5 条记录被分到一组,第 3、4 记录被分到一组。如果想看到每个分组的详细数据,我们可以使用循环打印出每个分组。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby("Team")
for name, grp in gk:
print(name)
print(grp)

这样我们便通过循环打印出了每个分组的名称和每个分组的详细数据。如果想获取某一个分组,可以使用 get_group() 方法,调用方法时,只要传入分组的名称即可。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby("Team")
print(gk.get_group("Bulls"))

上面讲的是按照单个关键字进行分组,下面讲一下按照多个关键字进行分组。

1.2 按多个关键字进行分组

按照多个关键字进行分组时,只需要将多个关键字组成一个列表,并将列表作为参数传入到 groupby() 函数中。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby(["Team", "Position"])
print(gk.groups)

从上面代码的输出结果中可以看出,第 2、3、4 条记录各自组成一个分组,第 1 和 5 条记录组成一个分组。分组完成后,像上面按照单个关键字分组一样,我们可以使用循环打印出各个分组的详细信息。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby(["Team", "Position"])
for name, grp in gk:
print(name)
print(grp)

像上面按照单个关键字分组一样,可以使用 ​​get_group()​​ 方法获取某个分组,我们只需要将多个关键字组成一个元组,并把元组作为参数传入到 ​​get_group()​​ 函数中。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby(["Team", "Position"])
print(gk.get_group(('Bulls', 'PG')))

2. 计算

2.1 使用自带函数

上面只是对 pandas 对象进行了分组,还没有进行任何计算,但是已经有了各分组执行运算所需的一切信息。例如,我们可以调用 GroupBy 的 mean() 方法来计算分组平均值:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby("Team")
print(gk.mean())

这样我们便计算了各个分组在 Age 和 Weight 列的平均值。对于按照多个关键字进行的分组,我们同样可以使用 mean() 方法来计算分组平均值。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk = df.groupby(["Team", "Position"])
print(gk.mean())

上面的例子在使用 mean() 方法计算分组平均值时,默认是对所有的数字列都进行求平均值,我们也可以只对部分列求平均值。例如:

import numpy as np
import pandas as pd


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk1 = df.groupby(["Team"])
print(gk1['Age'].mean())

gk2 = df.groupby(["Team", "Position"])
print(gk2['Age'].mean())

上面的例子只对 Age 这一列进行求平均值。

2.2 使用自定义函数

上面的例子中,对分组进行求值使用的是 pandas 自带的函数,我们也可以使用自定义的函数。例如:

import numpy as np
import pandas as pd


def peak_to_peak(arr):
return arr.max() - arr.min()


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk1 = df.groupby(["Team"])
print(gk1[['Age', 'Weight']].agg(peak_to_peak))

在上面的例子中,我们定义了一个函数 ​​peak_to_peak​​,并把函数传入到 agg() 中,这样函数 ​​peak_to_peak​​ 便作用到每个分组。agg() 函数不但可以使用自定义的函数,而且可以使用 pandas 自带的函数。例如:

import numpy as np
import pandas as pd


def peak_to_peak(arr):
return arr.max() - arr.min()


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk1 = df.groupby(["Team"])
print(gk1.agg('mean'))

使用 pandas 自带函数时,只需要将函数名作为字符串传入到 agg() 函数即可。上面的例子中,当指定一个函数时,这个函数便作用于所有的列,我们还可以对不同的列使用不同的函数,例如:

import numpy as np
import pandas as pd


def peak_to_peak(arr):
return arr.max() - arr.min()


df = pd.DataFrame({
"Team":['Lakers', 'Lakers', 'Bulls', 'Bulls', 'Lakers'],
"Position":['SF', 'PG', 'SF', 'PG', 'SF'],
"Age":[37, 24, 24, 27, 36],
"Weight":[212, 194, 225, 190, 260]
})

gk1 = df.groupby(["Team"])
print(gk1.agg({'Age': 'mean', 'Weight': peak_to_peak}))

标签:Lakers,Bulls,分组,PG,计算,Team,数据,SF
From: https://blog.51cto.com/u_15641375/5846620

相关文章

  • 关于计算机相关术语的介绍
    关于计算机相关术语的介绍点击查看代码了解计算机相关术语的目的:作为一个计算机相关专业的学生来说,大学开设的课程有:计算机基础、网页设计、计算机组成原理、数据结构......
  • 数据库为什么不用红黑树而用B+树
    得分点磁盘IO标准回答首先,红黑树是一种近似平衡二叉树(不完全平衡),结点非黑即红的树,它的树高最高不会超过2*log(n),因此查找的时间复杂度为O(log(n)),无论是增删改查......
  • 计算机相关知识
    计算机相关知识点击查看代码存储器:是计算机的重要组成部分.它可分为:计算机内部的存储器(简称内存)计算机外部的存储器(简称外存)内存储器从功能上可以分为:读写存储器RA......
  • 计算机网络的分层体系结构
    计算机网络的分层体系结构点击查看代码物理层:物理接口规范,传输比特流,网卡是工作在物理层的.数据链路层:成帧,保证帧的无误传输,MAC地址,形成EHTHERNET帧数据链......
  • 如何修复处于recovery挂起状态的数据库
    检查数据库的状态数据库的状态有:online、offline、restoring、recovering、suspect、emergency、recoverypendingSELECTname,state_descfromsys.databases 可能......
  • Redis Cluster 数据分片
    介绍RedisClusterRedis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。节点一个Redis集群通常由多个节点(no......
  • C# 计算不规则多边形的相交/包含等关系
    核心思路是使用Region的求交集和并集的结果与原始Region对比Winform项目自带这个类库,如果使用控制台,需要先在nuget安装System.Drawing.Common///<summary>......
  • C++一元多项式计算器的设计与实现
    C++一元多项式计算器的设计与实现七、一元多项式计算器的设计与实现1.基于动态数组或者链表实现--元多项式的计算,可以使用STL的vector或者list。2.在系统中需要提供必......
  • Redis Cluster 数据分片
    介绍RedisClusterRedis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能。节点一个Redis集群通常由多个节点(n......
  • 数据一致性离不开的checkpoint机制
    checkpoint如果系统每次收到写入请求后,等待数据完全写入持久化存储再返回结果,这样数据丢失的可能性大大减少,但是一般持久化操作都是磁盘IO操作(甚至网络IO操作),处理的耗时比......