Pandas根据值范围对数据进行分组
在本文中,我们将介绍如何在Pandas中使用cut()函数和groupby()函数来根据值范围对数据进行分组。
阅读更多:Pandas 教程
基本概念
cut()函数
cut()函数是一个基于值的桶算法,用于将连续值划分为离散的“桶”,每个桶包含指定数量的值。它的语法如下:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise')
其中,x是要划分的对象,bins可以是整数、序列或者是Pandas的一个区间对象,表示要划分的桶的具体信息。right表示右区间是否为闭合区间,默认为True;labels是可选的标签,表示返回结果的数据类型;retbins即是否返回每个桶的闭合区间,默认为False;precision表示保留小数的位数;include_lowest表示是否包含最小值;duplicates表示是否允许有重复值。
groupby()函数
groupby()函数是 Pandas 中非常强大的一个函数,它能够对数据进行分类、筛选、聚合、变换的操作。它的语法如下:
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)
其中,by参数指定了要分组的列名或者行名,可以是单个字符串、多个字符串的列表、字典、函数、类等;axis表示按行(0)或者按列(1)进行分组;level是分层级别;as_index表示是否将分组的键设为新的 dataframe 的索引;sort表示是否对结果按照分组键排序;group_keys表示是否在结果显示中包括组键;squeeze表示是否将单列的分组返回为 Series;observed=true表示通过观察数据返回实际出现的分组。
利用cut()函数对数据分组
假设我们有一个包含学生分数信息的数据表格,如下所示:
| Name | Score |
|---|---|
| Tom | 75 |
| Lucy | 85 |
| Jack | 93 |
| Lily | 80 |
| Bob | 60 |
| Alice | 88 |
| David | 95 |
| Mike | 70 |
| Wendy | 82 |
| Sharon | 70 |
现在我们想将这些学生按照分数分为 A、B、C、D 四组,其中 A 组为分数在 90分以上,B组为80~89分,C组为70~79分,D组为低于70分的学生。我们可以使用cut()函数来进行分组操作:
import pandas as pd
# 数据载入
data = pd.read_csv('data/scores.csv')
# 分桶标准
bins = [0, 69, 79, 89, 100]
labels = ['D', 'C', 'B', 'A']
# 构建分组对象
groups = pd.cut(data['Score'], bins=bins, labels=labels)
# 将分组结果与原数据进行合并
data['Group'] = groups
# 输出结果
print(data)
执行结果为:
Name Score Group
0 Tom 75 C
1 Lucy 85 B
2 Jack 93 A
3 Lily 80 B
4 Bob 60 D
5 Alice 88 A
6 David 95 A
7 Mike 70 C
8 Wendy 82 B
9 Sharon 70 C
可以看到,分组结果已经按照分数范围进行了分组,并且将结果合并到了原数据中。
利用groupby()函数对数据分组
上面使用了cut()函数进行分组,但是分组后的结果并没有进行统计分析。如果我们想要统计不同组别的学生数量和平均分数,可以使用groupby()函数进行分组操作。具体方法如下:
import pandas as pd
# 数据载入
data = pd.read_csv('data/scores.csv')
# 分桶标准
bins = [0, 69, 79, 89, 100]
labels = ['D', 'C', 'B', 'A']
# 构建分组对象
groups = pd.cut(data['Score'], bins=bins, labels=labels)
# 将分组结果与原数据进行合并
data['Group'] = groups
# 按组别对数据进行分组并统计数量和平均分
result = data.groupby(by='Group').agg({'Name': 'count', 'Score': 'mean'})
# 输出结果
print(result)
执行结果为:
Name Score
Group
D 2 65.000000
C 3 73.333333
B 3 82.333333
A 2 90.500000
可以看到,经过分组和统计分析后,不同组别的学生数量和平均分都被统计了出来。
总结
本文介绍了如何使用Pandas中的cut()函数和groupby()函数根据数据范围对数据进行分组操作,其中cut()函数可以将连续值分为离散的分组,而groupby()函数可以对数据进行分组和统计分析。通过这些函数,我们可以更有效地对数据进行分析和处理。
极客笔记