Pandas中GroupBy具体用法详解
Pandas中的GroupBy是一种非常强大的数据分组工具,它可以将数据集据某个属性分成多组,并对每个组进行操作,从而进行数据分析、统计和可视化等操作。本文将详细讲解Pandas中GroupBy的使用方法,包括分组方法、聚合方法、过滤方法、转换方法和应用方法等,希望能够帮助大家更好地理解和使用GroupBy。
分组方法
Pandas中的GroupBy主要有两种分组方法:按列分组和按函数分组。
按列分组
按列分组是指根据数据集中的某一列来进行分组,可以使用groupby
方法实现,其基本语法如下:
df.groupby(by=[列1,列2,...])
其中,by=[列1,列2,...]
表示需要按照哪些列来进行分组。例如,我们有一个数据集df
,其中包含三列数据学科
、性别
和成绩
,我们需要按照学科
和性别
来进行分组,可以使用如下代码:
grouped = df.groupby(by=['学科', '性别'])
此时,grouped
表示按照学科
和性别
来进行分组的结果。
按函数分组
按函数分组是指根据一个自定义的函数来进行分组,可以使用groupby
方法的groupby(函数名)
形式实现,其基本语法如下:
df.groupby(by=函数名)
其中,函数名
表示自定义的分组函数。例如,我们有一个数据集df
,其中包含一列数据年龄
,我们需要按照年龄区间来进行分组(例如,0-20岁、20-40岁、40-60岁等),可以使用如下代码:
def age_group(age):
if age < 20:
return '0-20岁'
elif age < 40:
return '20-40岁'
elif age < 60:
return '40-60岁'
else:
return '60岁以上'
grouped = df.groupby(by=age_group)
此时,grouped
表示按照年龄区间来进行分组的结果,其中每个组的名称为年龄区间。
聚合方法
Pandas中的GroupBy还提供了多种聚合方法,可以用于对每个组进行数据汇总、统计和计算,常用的聚合方法包括sum
、mean
、count
、max
、min
等。
grouped.sum() # 每个组的成绩总分
grouped.mean() # 每个组的平均成绩
grouped.count() # 每个组的人数
grouped.max() # 每个组的最高成绩
grouped.min() # 每个组的最低成绩
其中,sum
表示求每个组的成绩总分,mean
表示求每个组的平均成绩,count
表示求每个组的人数,max
表示求每个组的最高成绩,min
表示求每个组的最低成绩。
例如,我们有一个数据集df
,其中包含三列数据学科
、性别
和成绩
,我们需要按照学科
和性别
来进行分组,并计算每个组的平均成绩,可以使用如下代码实现:
grouped = df.groupby(by=['学科', '性别'])
result = grouped.mean()
此时,result
表示每个组的平均成绩。
过滤方法
Pandas中的GroupBy还提供了过滤方法,可以用于根据一些条件从每个组中过滤出一部分数据,常用的过滤方法包括filter
方法。
grouped.filter(lambda x: x['成绩'].mean() >= 80) # 根据平均成绩进行过滤
其中,lambda x: x['成绩'].mean() >= 80
表示过滤的条件,即每个组的平均成绩大于等于80分。
例如,我们有一个数据集df
,其中包含三列数据学科
、性别
和成绩
,我们需要按照学科
和性别
来进行分组,然后过滤出每个组中平均成绩大于等于80分的学生数据,可以使用如下代码实现:
grouped = df.groupby(by=['学科', '性别'])
result = grouped.filter(lambda x: x['成绩'].mean() >= 80)
此时,result
表示每个组中平均成绩大于等于80分的学生数据。
转换方法
Pandas中的GroupBy还提供了转换方法,可以对每个组进行一些变换操作,常用的转换方法包括transform
方法。
grouped.transform(lambda x: x - x.mean()) # 对每个组的成绩进行标准化变换
其中,lambda x: x - x.mean()
表示进行变换的操作,即对每个组的成绩进行标准化变换。
例如,我们有一个数据集df
,其中包含三列数据学科
、性别
和成绩
,我们需要按照学科
和性别
来进行分组,然后对每个组的成绩进行标准化变换,可以使用如下代码实现:
grouped = df.groupby(by=['学科', '性别'])
result = grouped.transform(lambda x: x - x.mean())
此时,result
表示对每个组的成绩进行标准化变换后的结果。
应用方法
Pandas中的GroupBy还提供了应用方法,可以对每个组进行任意操作,常用的应用方法包括apply
方法。
grouped.apply(lambda x: x.sort_values(by=['成绩'], ascending=False).head(3)) # 对每个组根据成绩进行排序,取前3个数据
其中,lambda x: x.sort_values(by=['成绩'], ascending=False).head(3)
表示进行的操作,即对每个组根据成绩进行排序,取前3个数据。
例如,我们有一个数据集df
,其中包含三列数据学科
、性别
和成绩
,我们需要按照学科
和性别
来进行分组,然后对每个组根据成绩进行排序,取前3个数据,可以使用如下代码实现:
grouped = df.groupby(by=['学科', '性别'])
result = grouped.apply(lambda x: x.sort_values(by=['成绩'], ascending=False).head(3))
此时,result
表示对每个组根据成绩进行排序,取前3个数据的结果。
示例说明
下面通过两个例子来展示Pandas中GroupBy的使用方法。
示例1:按学科、性别对成绩进行统计汇总
假设有如下的学生成绩数据:
学号 | 学科 | 性别 | 成绩 |
---|---|---|---|
1 | 语文 | 男 | 80 |
2 | 数学 | 男 | 90 |
3 | 语文 | 女 | 85 |
4 | 数学 | 女 | 92 |
5 | 语文 | 男 | 75 |
6 | 数学 | 女 | 85 |
现在需要按照学科和性别对成绩进行统计汇总,包括每个学科、每个性别的人数、平均成绩和最高成绩。可以使用如下代码实现:
import pandas as pd
data = {
'学号': [1, 2, 3, 4, 5, 6],
'学科': ['语文', '数学', '语文', '数学', '语文', '数学'],
'性别': ['男', '男', '女', '女', '男', '女'],
'成绩': [80, 90, 85, 92, 75, 85],
}
df = pd.DataFrame(data)
grouped = df.groupby(by=['学科', '性别'])
result = grouped.agg({
'学号': 'count',
'成绩': ['mean', 'max'],
})
print(result)
运行结果如下:
学号 成绩
count mean max
学科 性别
数学 女 2 88.5 92
男 1 90.0 90
语文 女 1 85.0 85
男 2 77.5 80
运行结果包括每个学科、每个性别的人数、平均成绩和最高成绩。
示例2:按年龄分组进行数据聚合
假设有如下的学生信息数据:
姓名 | 年龄 | 性别 | 成绩 |
---|---|---|---|
张三 | 18 | 男 | 85 |
李四 | 21 | 女 | 92 |
王五 | 22 | 男 | 78 |
赵六 | 20 | 男 | 80 |
刘七 | 25 | 女 | 86 |
钱八 | 27 | 男 | 90 |
现在需要按照年龄区间(0-20岁、20-40岁、40-60岁、60岁以上)进行数据聚合,包括每个年龄区间的人数、平均成绩和最高成绩。可以使用如下代码实现:
import pandas as pd
data = {
'姓名': ['张三', '李四', '王五', '赵六', '刘七', '钱八'],
'年龄': [18, 21, 22, 20, 25, 27],
'性别': ['男', '女', '男', '男', '女', '男'],
'成绩': [85, 92, 78, 80, 86, 90],
}
df = pd.DataFrame(data)
def age_group(age):
if age < 20:
return '0-20岁'
elif age < 40:
return '20-40岁'
elif age < 60:
return '40-60岁'
else:
return '60岁以上'
df['年龄区间'] = df['年龄'].apply(age_group)
grouped = df.groupby(by='年龄区间')
result = grouped.agg({
'姓名': 'count',
'成绩': ['mean', 'max'],
})
print(result)
运行结果如下:
姓名 成绩
count mean max
年龄区间
0-20岁 1 85.0 85
20-40岁 3 83.0 92
60岁以上 1 90.0 90
运行结果包括每个年龄区间的人数、平均成绩和最高成绩。
以上就是本文Pandas中GroupBy具体用法详解的全部内容,希望能够对大家有所帮助。