pandas 是一个用于数据处理和分析的 Python 库,由于其强大而简单的功能,已经成为了数据科学家和分析师的首选库之一。在 pandas 中,groupby 是一个非常重要的函数,它可以帮助我们对数据进行分组和聚合。本文将详细介绍 pandas groupby 函数的各种用法。
一、分组(Grouping)
groupby函数是将数据按照一定规则分成一组的工具。其基本语法如下:
grouped = df.groupby(key)
其中,key是指按照哪个列进行分组。groupby函数返回的是按照指定列分组后的一个groupby对象。我们可以通过如下代码观察分组的结果:
import pandas as pd
data = {'Name': ['Mike', 'Bob', 'Alex', 'Alice', 'Bruce', 'Bob'],
'Gender': ['M', 'M', 'M', 'F', 'M', 'M'],
'City': ['Beijing', 'Shanghai', 'Shanghai', 'Beijing','Beijing', 'Shanghai'],
'Salary': [10000, 30000, 20000, 15000, 25000, 15000]
}
df = pd.DataFrame(data)
grouped = df.groupby('City')
for name, group in grouped:
print(name)
print(group)
print("---------")
运行以上代码,输出结果如下:
Beijing Name Gender City Salary 0 Mike M Beijing 10000 3 Alice F Beijing 15000 4 Bruce M Beijing 25000 --------- Shanghai Name Gender City Salary 1 Bob M Shanghai 30000 2 Alex M Shanghai 20000 5 Bob M Shanghai 15000 ---------
该结果表明,我们按照城市对数据进行了分组,然后将分组结果依次输出。
二、聚合(Aggregation)
在分组完成之后,我们可能需要对每一个组进行聚合操作。在 pandas 中,有多种聚合函数可供选择。比如:
- mean:计算组的平均值
- sum:计算组的总和
- size:计算组的大小
- max:计算组的最大值
- min:计算组的最小值
- std:计算组的标准差
- var:计算组的方差
我们可以使用这些聚合函数来对每一个组进行聚合操作。其基本语法如下:
grouped = df.groupby(key)
grouped.agg(func)
其中,func是我们想要对组进行的聚合操作,可以是mean、sum、size等。
下面是一些代码示例:
# 按城市计算平均薪资
grouped = df.groupby('City')
grouped['Salary'].mean()
# 输出结果如下
# City
# Beijing 16666.666667
# Shanghai 21666.666667
# Name: Salary, dtype: float64
# 按城市和性别计算平均薪资和总薪资
grouped = df.groupby(['City', 'Gender'])
grouped['Salary'].agg([np.mean, np.sum])
# 输出结果如下
# mean sum
# City Gender
# Beijing F 15000 15000
# M 17500 35000
# Shanghai M 18750 37500
三、迭代(Iteration)
通过 groupby 函数分组后,我们可以使用其迭代功能来遍历每一个分组。其基本语法如下:
for name, group in grouped:
# 对每一个分组进行操作
其中,name是指分组的名称,group是指对应分组的 DataFrame。
例如,我们可以按城市分组并遍历每一个分组,输出平均薪资:
grouped = df.groupby('City')
for name, group in grouped:
print(name)
print(group['Salary'].mean())
print("---------")
输出结果如下:
Beijing 16666.666666666668 --------- Shanghai 21666.666666666668 ---------
四、过滤(Filtering)
我们可以使用 filter 函数筛选出符合条件的数据。其基本语法如下:
grouped = df.groupby(key)
grouped.filter(func)
其中,func是一个函数,用来判断某一行是否符合条件。
例如,我们可以按城市分组,然后筛选出平均薪资高于20000的行:
grouped = df.groupby('City')
grouped.filter(lambda x: x['Salary'].mean() > 20000)
# 输出结果如下
# Name Gender City Salary
# 1 Bob M Shanghai 30000
# 2 Alex M Shanghai 20000
# 4 Bruce M Beijing 25000
五、转换(Transforming)
Transforming 操作是指对每一个分组进行独立的操作,且该操作生成的结果的行列数与原来的 DataFrame 相同。其基本语法如下:
grouped = df.groupby(key)
grouped.transform(func)
其中,func是一个函数,用来对每一个分组进行操作。
例如,我们可以按城市分组,然后对每一个分组进行标准化处理:
grouped = df.groupby('City')
score = lambda x: (x - x.mean()) / x.std()
grouped.transform(score)
# 输出结果如下:
# Salary
# 0 -1.135550
# 1 1.000000
# 2 -0.707107
# 3 -0.404520
# 4 0.707107
# 5 -0.450981
六、应用(Applying)
使用 apply 函数可以对整个 DataFrame 进行独立的操作,其可以返回任意形状的结果。其基本语法如下:
grouped = df.groupby(key)
grouped.apply(func)
其中,func是一个函数,用来对整个 DataFrame 进行操作。
例如,我们可以按城市分组,然后对每一个分组进行 t-检验:
import scipy.stats as stats
grouped = df.groupby('City')
def t_test(group):
return stats.ttest_1samp(group['Salary'], 20000)
grouped.apply(t_test)
# 输出结果如下:
# City
# Beijing 0.670820
# Shanghai 1.000000
#
该结果表明,北京的平均薪资显著低于20000,而上海的平均薪资则不显著低于20000。
结束语
pandas groupby 函数是 pandas 库中非常重要而实用的功能。通过本文的详细介绍,相信大家已经学会了如何对数据进行分组、聚合、迭代、筛选、转化和应用操作,这些操作都是非常有用且广泛使用的数据分析工具。