Python中的pandas库提供了DataFrame.groupby()函数,依照指定的分组条件,会把表格按照分组条件进行分组,并在每个分组上进行聚合操作。这个函数的用途非常广泛,一般用于数据的汇总、分析和统计。下面介绍几个使用DataFrame.groupby()的示例来详解这个函数。
1. 基本语法
DataFrame.groupby()函数的基本语法为:DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)
其中参数说明如下:
-
by: 表示分组的依据列或依据函数,默认为None,表示分组不依赖任何列,即不做分组。by可以是列名(字符串),或者用列表指定多个列名做分组,还可以是函数,函数返回值为分组的依据。例如:
df.groupby('category')
或df.groupby(['category','year'])
或df.groupby(lambda x:x%2==0)
。 -
axis:表示按照行(axis=0)或列(axis=1)来分组,默认是0表示按照行分组。
-
level:表示在多层索引的情况下,使用该参数指定分组的索引等级。
-
as_index:表示是否将分组的列设置为新的索引,默认为True表示是,这意味着分组的列不会在结果中出现。
-
sort:表示是否对分组后的结构进行排序,默认是True。设置为False可以提升效率。
-
group_keys:表示是否对结果设置分组名,默认为True。
-
squeeze:表示是否取消单一分组的分组结果直接输出,默认为False,表示不取消。
-
observed:表示是否遵循类别未出现的保留策略,默认为False。
下面通过两个示例来详解DataFrame.groupby()的使用方法
2. 示例一:
假设我们有以下数据集,我们需要按照category列进行分组,并统计每个分组总金额和平均价格:
import pandas as pd
data = {'category': ['fruit', 'fruit', 'vegetable', 'vegetable', 'drink', 'drink'],
'item': ['apple', 'banana', 'cabbage', 'apple', 'water', 'soda'],
'price': [2.0, 3.0, 1.5, 2.5, 1.2, 3.2],
'quantity': [2, 3, 5, 2, 4, 5]}
df=pd.DataFrame(data)
print(df)
运行结果:
category item price quantity
0 fruit apple 2.0 2
1 fruit banana 3.0 3
2 vegetable cabbage 1.5 5
3 vegetable apple 2.5 2
4 drink water 1.2 4
5 drink soda 3.2 5
接下来,使用groupby()函数按照category分组,并处理总价格(price列求和)和平均价格(price列求平均数):
df_grouped = df.groupby(['category']).agg({'price': [sum, 'mean']})
print(df_grouped)
运行结果:
price
sum mean
category
drink 4.4 2.200000
fruit 5.0 2.500000
vegetable 4.0 2.000000
在这个示例中,我们首先创建了一个包含产品信息的DataFrame,然后用.groupby()函数按照category列进行分组,同时用agg()函数进行合并。由于我们想要计算总和和平均值,所以将这些操作作为agg()参数传递。最后,我们的程序输出每个类别的价格总和和平均价格。
3. 示例二:
接下来,让我们看一个更复杂的示例。我们将使用鸢尾花(iris)数据集,其中包含多个测量值,包括花瓣大小、花萼大小、花瓣宽度、花萼宽度等。在这个示例中,我们将使用.groupby()函数对鸢尾花数据进行汇总。
import seaborn as sns
iris = sns.load_dataset('iris') # 使用seaborn中自带的鸢尾花数据集
print(iris.head()) # 输出数据前5行
运行结果:
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
现在,我们使用.groupby()函数对数据进行,按照' species '列为键值进行分组,并使用.describe()函数传递给.agg()函数来获取分组结果的各种描述性统计:
iris_grouped = iris.groupby('species').agg(['mean', 'std'])
print(iris_grouped)
运行结果:
sepal_length sepal_width ... petal_length petal_width
mean std mean ... std mean std
species ...
setosa 5.0060 0.352490 3.4280 ... 0.173511 0.2460 0.105386
versicolor 5.9360 0.516171 2.7700 ... 0.469911 1.3260 0.197753
virginica 6.5875 0.635880 2.9740 ... 0.551895 2.0260 0.274650
在这个示例中,我们首先使用seaborn中自带的iris数据集,并使用.head()函数输出前五行数据。然后,我们按照species列进行分组,用.agg()函数传递.describe()函数来获取分组结果的各种描述性统计(均值、标准差等)。
4. 总结
在本文中,我们详解了Python DataFrame.groupby()函数的使用,包括基本的语法格式以及如何使用函数处理多个数据集。这个函数非常强大,能够处理各种不同的复杂数据集和分析工作。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python DataFrame.groupby()聚合函数,分组级运算 - Python技术站