Pandas分组函数:全面概述其所有功能
作者:社区 / 开发者
2024年1月3日
导航到
Python凭借其丰富的库在编程用例中处于领先地位。其中之一是pandas库。Pandas可以用于处理大型和复杂的数据集。它包含许多函数和方法,允许用户操作、分析和可视化数据。Pandas的一个功能就是分组。本文将介绍分组函数、其语法以及一些示例用法。本教程面向刚开始使用分组函数的开发者,并旨在将其应用于他们的应用程序。
什么是Pandas分组?
Pandas分组在数据分析中经常被使用。它允许您对数据进行分组,然后对分组数据执行某些函数或聚合。分组基于某种类别生成。假设您有一个包含汽车型号、公司和价格的数据集。分组允许您通过按公司对数据集进行分组,然后对值应用平均函数来找到每家公司的平均汽车成本。
语法
让我们首先概述Pandas分组函数的语法。
df.groupby(by=None, axis=0,sort=True)
分组函数有多个参数,除了上述参数外,还可以通过各种组合使用以达到预期结果。上述语法如下所述
-
by:此参数接受一个函数或映射。它用于指定日期应该如何分组,并允许您定义分组的标准。
-
axis:axis参数是一个整数。它决定了分组是在数据框的行(0)还是列(1)上执行。将其设置为0表示按行分割,设置为1表示按列分割。
-
sort:将此设置为true允许您对分组键进行排序。
Pandas分组示例
在深入具体示例之前,让我们了解pandas中的数据框。数据框是pandas的核心数据结构。它们提供了分组函数有意义所需的上下文和结构。
数据框是一个二维数据结构。它将数据按行和列排序。简单来说,数据框可以被视为一个表格。让我们创建一个简单的数据框
Import pandas as pd df = pd.DataFrame({"Name": ['Ali', 'Ben'], "Age": [23, 32]}) print(df)
上述代码的输出如下所示: 姓名和年龄代表列名。整数0和1代表每行的索引。现在我们知道了什么是数据框,让我们从仓库读取数据。
noaa-ndbc-data/latest-observations.csv using Pandas df = pd.read_csv('latest-observations.csv')
以这种方式读取数据将为我们提供一个数据框作为输出,就像我们在这里看到的那样:现在,假设我们有给定的数据,我们想更多地了解它以进行数据分析。我们可以使用Python的Groupby函数。让我们先看看可用的列。
col_names = list(df.columns) col_names
假设我们想找到风速唯一值的计数。我们可以运行以下命令
result = df.groupby('wind_speed_mps').size().reset_index(name='Count')
print(result)
输出显示了每个风速值的计数。这些数据使我们能够理解1.0米每秒是最常见的风速,因为它是出现频率最高的数值。另一方面,风速1.6、2.3、3.5和4.7只发生一次。
Pandas Groupby:多列
您还可以在Pandas中对多列进行分组。假设我们想同时计算阵风和风速。我们不必运行两个单独的命令,而是可以修改原始命令来适应这种变化
result = df.groupby(['wind_speed_mps', 'gust_speed_mps']).size().reset_index(name='Count')
得到的结果数据框如下:这个命令实际上是找出给定风速值时阵风速度的出现次数。因此,当风速为0.0且阵风为0.0时,计数为6。但是当风速为0且阵风为0.5时,计数为7。因此,它创建了一个类似层次的结构。
Pandas Groupby:聚合
Groupby还包含一个聚合函数,它允许您对数据进行分组并应用选择的聚合函数。当您拥有大量数据并希望将其聚类以简化时,这是一个非常有用的工具。假设我们想通过风速对数据进行分组以找到所有值的计数。这可以通过以下命令轻松实现
result = df.groupby(['wind_speed_mps']).aggregate('count') result
现在,wind_speed是数据框的索引,所有列的计数也都在其中。如果我们将聚合函数从count改为mean,输出也会改变。
result = df.groupby(['wind_speed_mps']).aggregate(‘mean’) result
现在我们知道,对于风速为1.0米每秒的情况,平均阵风速度为1.81米每秒。我们可以在这里应用不同的聚合函数,例如sum。
Pandas Groupby:均值
我们还可以使用Groupby均值命令来找到不同列的均值。假设我想找出每个站点的所有这些属性的均值。为了做到这一点,我们可以执行以下命令。
df.groupby(['station_id']).mean() We get the following as an output
对于每个站点的ID,我们得到wind_dir_degt、wind_speed等的均值。但如果我们只想找到每个站点的平均海平面气压怎么办?我们将原始命令更改为以下内容
df.groupby(['station_id'])['sea_level_pressure_hpa'].mean()
我们会得到以下数据框作为输出:现在我们知道,对于station_id 13009,没有关于sea_level_pressure的数据。这可能是数据错误,这可能表明更大的问题。Python Groupby使我们能够分析和查找数据中的错误。太好了!
Pandas Groupby:总和
同样,Groupby有一个总和函数,允许您对组进行求和。假设我们想找到每个站点的海平面气压的总和。我们将执行以下命令
df.groupby('station_name')['sea_level_pressure_hpa'].sum()
我们现在可以看到每个站点记录的海平面总和大致情况。如果我们没有指定要对其求和的特定列,Python将给出数据框中所有属性的总和。像这样的见解可以帮助我们发现数据中的异常,并了解是否存在我们应该关注的问题。
例如,在上面的案例中,我们看到弗吉尼亚州约克湾的海压总和为0.0。这可能会引发一些疑问。这些是不是在约克湾站的数据测量中出现了问题?为什么从未记录过任何值?这些问题可以在更高层次上提出,并允许你发现异常。
Pandas Groupby: 应用
在Pandas中,还有一个非常有用的函数可以使用。Groupby apply 允许你对数据中的每个组应用自定义函数。假设我们想找到每个站点的最大风速,运行以下命令
df.groupby('station_name').apply(lambda x: x['wind_speed_mps'].max())
我们也可以使用apply创建自定义函数。假设我们想找到风速与阵风风速之差的平均值,我们可以应用以下函数。
df.groupby('station_name').apply(lambda x: (x['wind_speed_mps'] - x['gust_speed_mps']).mean())
结果数据框如下所示
要点总结
在这篇文章中,我们看到了Python pandas Groupby是一个非常有用的函数,允许我们根据不同的类别对数据进行分组,并在其上应用各种函数。这些函数也可以是自定义函数,就像我们之前看到的。
Groupby是一个强大的工具,允许用户分析大型数据集,检测异常,并理解模式和趋势。通过InfluxDB,你可以通过单一、专为时序数据集设计的数据库获得实时见解。[InfluxDB](https://influxdb.org.cn/)提供低延迟、无限基数、原生SQL支持和优秀的数据压缩。今天[联系我们](https://influxdb.org.cn/general-inquiries/),了解我们如何满足您的编程需求。
本文由Ali Mannan Tirmizi撰写。[Ali](https://www.linkedin.com/in/alimannantirmizi/)是一位高级DevOps经理,擅长SaaS文案写作。他拥有电气工程和物理学学位,并在制造IT、DevOps和社会影响领域担任过多个领导职位。