Python数据的筛选、排序与聚合
在数据分析过程中,我们常常需要对数据进行筛选、排序和聚合操作,以便从数据集中提取有价值的信息。这些操作是数据预处理和分析的基础,尤其在处理大型数据集时,能够帮助我们快速定位关键数据,进行进一步的分析。Pandas提供了强大的工具来支持这些操作,主要通过对Series和DataFrame的相关方法进行操作来实现。
本节将详细讲解如何使用Pandas的Series和DataFrame进行数据的筛选、排序与聚合,并通过一些代码示例来演示具体的操作。
示例数据集
为了便于理解,我们先构造一个包含10条测试数据的DataFrame,其中包括了姓名、年龄、性别和工资等字段,数据如下:
import pandas as pd
# 构造测试数据
data = {
'姓名': ['张三', '李四', '王五', '赵六', '王五', '李四', '赵六', '周七', '郑八', '刘九'],
'年龄': [23, 25, 30, 29, 27, 25, 29, 24, 28, 22],
'性别': ['男', '女', '男', '男', '男', '女', '男', '男', '女', '男'],
'工资': [5000, 6000, 7000, 8000, 7000, 6000, 8000, 4500, 5000, 6500]
}
# 创建DataFrame
df = pd.DataFrame(data)
# 打印原始数据
print("原始数据:")
print(df)
输出结果如下:
原始数据:
姓名 年龄 性别 工资
0 张三 23 男 5000
1 李四 25 女 6000
2 王五 30 男 7000
3 赵六 29 男 8000
4 王五 27 男 7000
5 李四 25 女 6000
6 赵六 29 男 8000
7 周七 24 男 4500
8 郑八 28 女 5000
9 刘九 22 男 6500
数据筛选
在数据分析中,筛选数据是常见的操作。我们可以基于条件筛选出符合要求的数据行。使用Pandas的条件表达式非常直观,下面我们演示如何根据不同的条件筛选数据。
1. 筛选特定年龄段的数据
例如,我们想筛选出年龄在25岁以上的员工数据,可以使用以下代码:
# 筛选年龄大于25的数据
df_filtered = df[df['年龄'] > 25]
# 打印筛选后的数据
print("\n年龄大于25的数据:")
print(df_filtered)
代码解析:
-
df['年龄'] > 25
:这一条件筛选出年龄大于25的行,返回一个布尔型Series。 -
df[df['年龄'] > 25]
:利用布尔索引,筛选出符合条件的行。
输出结果如下:
年龄大于25的数据:
姓名 年龄 性别 工资
2 王五 30 男 7000
3 赵六 29 男 8000
4 王五 27 男 7000
6 赵六 29 男 8000
8 郑八 28 女 5000
2. 筛选特定性别的数据
假设我们需要筛选出所有女性员工的数据,可以通过以下代码实现:
# 筛选性别为女的数据
df_female = df[df['性别'] == '女']
# 打印筛选后的数据
print("\n性别为女的数据:")
print(df_female)
代码解析:
-
df['性别'] == '女'
:这一条件筛选出性别为“女”的行。 -
df[df['性别'] == '女']
:同样,利用布尔索引筛选出符合条件的行。
输出结果如下:
性别为女的数据:
姓名 年龄 性别 工资
1 李四 25 女 6000
5 李四 25 女 6000
8 郑八 28 女 5000
数据排序
排序是另一个常见的数据处理操作,我们可以根据一个或多个字段对数据进行升序或降序排列。Pandas提供了sort_values()
方法来实现排序操作。
1. 按工资升序排序
如果我们想根据员工的工资进行升序排序,可以使用以下代码:
# 按工资升序排序
df_sorted_asc = df.sort_values(by='工资', ascending=True)
# 打印排序后的数据
print("\n按工资升序排序的数据:")
print(df_sorted_asc)
代码解析:
-
df.sort_values(by='工资', ascending=True)
:by
参数指定根据哪个列排序,ascending=True
表示按升序排列。 - 返回的DataFrame是一个新的排序后的结果。
输出结果如下:
按工资升序排序的数据:
姓名 年龄 性别 工资
7 周七 24 男 4500
8 郑八 28 女 5000
0 张三 23 男 5000
9 刘九 22 男 6500
1 李四 25 女 6000
5 李四 25 女 6000
2 王五 30 男 7000
4 王五 27 男 7000
3 赵六 29 男 8000
6 赵六 29 男 8000
2. 按工资降序排序
如果我们希望按工资进行降序排序,可以将ascending
参数设置为False
:
# 按工资降序排序
df_sorted_desc = df.sort_values(by='工资', ascending=False)
# 打印排序后的数据
print("\n按工资降序排序的数据:")
print(df_sorted_desc)
代码解析:
-
df.sort_values(by='工资', ascending=False)
:将ascending
参数设置为False
,表示按降序排序。
输出结果如下:
按工资降序排序的数据:
姓名 年龄 性别 工资
3 赵六 29 男 8000
6 赵六 29 男 8000
2 王五 30 男 7000
4 王五 27 男 7000
9 刘九 22 男 6500
1 李四 25 女 6000
5 李四 25 女 6000
8 郑八 28 女 5000
0 张三 23 男 5000
7 周七 24 男 4500
数据聚合
聚合操作用于对数据进行汇总,以便从中提取出重要的信息。常见的聚合操作包括计算总和、均值、最大值、最小值等。Pandas提供了groupby()
和聚合方法来实现这一操作。
1. 按性别进行分组,计算每组的工资平均值
我们可以按性别分组,并计算每个性别组的平均工资:
# 按性别分组,计算每组的工资平均值
df_grouped = df.groupby('性别')['工资'].mean()
# 打印聚合后的数据
print("\n按性别分组后的工资平均值:")
print(df_grouped)
代码解析:
-
df.groupby('性别')
:按性别列进行分组。 -
['工资'].mean()
:在每个分组内计算工资列的均值。
输出结果如下:
按性别分组后的工资平均值:
性别
女 5666.666667
男 6500.000000
Name: 工资, dtype: float64
2. 按年龄范围分组,计算每组的工资总和
假设我们想按年龄段进行分组,并计算每个年龄段内的工资总和,我们可以创建一个新的年龄段列,并进行聚合:
# 创建年龄段列
df['年龄段'] = pd.cut(df['年龄'], bins=[20, 25, 30, 35], labels=['20-25', '25-30', '30-35'])
# 按年龄段分组,计算每组的工资总和
df_grouped_by_age = df.groupby('年龄段')['工资'].sum()
# 打印按年龄段分组后的数据
print("\n按年龄段分组后的工资总和:")
print(df_grouped_by_age)
代码解析:
-
pd.cut(df['年龄'], bins=[20, 25, 30, 35], labels=['20-25', '25-30', '30-35'])
:使用pd.cut
将年龄列分成不同的区间,bins
参数指定了区间的边界,labels
参数为每个区间赋予了标签。 -
df.groupby('年龄段')['工资'].sum()
:按年龄段分组后,计算每个年龄段的工资总和。
输出结果如下:
按年龄段分组后的工资总和:
年龄段
20-25 23500
25-30 23500
30-35 7000
Name: 工资, dtype: int64
总结
在本节中,我们介绍了如何使用Pandas的Series
和DataFrame
进行数据的筛选、排序与聚合操作。通过几个实际的示例,我们演示了如何:
- 使用布尔索引进行数据筛选。
- 对数据进行升序和降序排序。
- 使用
groupby()
方法按指定列对数据进行分组,并应用聚合函数(如求和、均值等)。
这些操作是数据分析中不可或缺的步骤,可以帮助我们从复杂的数据集中提取出更有价值的信息,进一步为数据分析提供基础。在实际应用中,您可以根据具体的数据需求灵活使用这些操作。