在数据分析领域,Pandas 是一个非常强大的工具库,尤其适用于处理表格数据。groupby
是 Pandas 中最常用且功能强大的函数之一,它允许我们根据某些条件对数据进行分组,并在此基础上执行各种聚合操作,无论你是初学者还是有经验的数据分析师,掌握groupby
的用法都是非常重要的,本文将通过生动的例子、简明的解释和贴近生活的比喻,帮助你深入理解groupby
的用法,并提供一些实用的见解或建议。
1. GroupBy 基础概念
什么是 GroupBy?
groupby
就是将数据按照某些条件(如某一列的值)进行分组,然后对每个分组分别执行某种操作(如求和、求平均等),这就好比你在超市购物时,把水果放在一个篮子里,蔬菜放在另一个篮子里,然后分别计算每个篮子的总价格。
在编程中,groupby
操作通常分为三个步骤:
1、Split:将数据分成多个组。
2、Apply:对每个组应用某个函数(如求和、计数等)。
3、Combine:将结果组合成一个新的数据结构。
例子:超市购物清单
假设你有一张超市购物清单,记录了每次购买的商品名称、数量和单价,你可以使用groupby
来按商品名称分组,然后计算每种商品的总花费。
import pandas as pd 创建一个简单的购物清单 data = { '商品': ['苹果', '香蕉', '苹果', '香蕉', '橙子'], '数量': [5, 3, 4, 6, 8], '单价': [2, 1, 2, 1, 3] } df = pd.DataFrame(data) 使用 groupby 按商品分组,并计算每种商品的总花费 result = df.groupby('商品').apply(lambda x: (x['数量'] * x['单价']).sum()).reset_index(name='总花费') print(result)
输出结果:
商品 总花费 0 苹果 18 1 香蕉 9 2 橙子 24
在这个例子中,我们首先按“商品”列进行了分组,然后对每个分组计算了总花费,这就像你在超市结账时,先按商品种类分类,再计算每种商品的总价。
2. 常见的 GroupBy 操作
1 聚合函数
groupby
后常用的聚合函数包括:
sum()
:求和
mean()
:求平均值
count()
:计数
max()
和min()
:求最大值和最小值
size()
:计算每个分组的大小(即行数)
first()
和last()
:获取每个分组的第一行和最后一行
这些函数可以帮助我们快速了解数据的分布情况,如果你想知道每个月的销售额,可以使用groupby
按月份分组,然后对销售额求和。
例子:学生考试成绩
假设你有一个包含学生考试成绩的数据集,你想按班级统计每个班级的平均成绩,你可以这样做:
创建一个包含学生成绩的数据集 data = { '姓名': ['小明', '小红', '小华', '小强', '小丽'], '班级': ['A班', 'B班', 'A班', 'B班', 'A班'], '成绩': [85, 92, 78, 88, 90] } df = pd.DataFrame(data) 按班级分组,计算每个班级的平均成绩 result = df.groupby('班级')['成绩'].mean().reset_index(name='平均成绩') print(result)
输出结果:
班级 平均成绩 0 A班 84.333333 1 B班 90.000000
2 多列分组
有时我们需要根据多列来进行分组,你想按班级和科目来统计学生的成绩,可以同时指定多列作为分组依据。
创建一个包含学生成绩的数据集 data = { '姓名': ['小明', '小红', '小华', '小强', '小丽'], '班级': ['A班', 'B班', 'A班', 'B班', 'A班'], '科目': ['数学', '语文', '数学', '语文', '数学'], '成绩': [85, 92, 78, 88, 90] } df = pd.DataFrame(data) 按班级和科目分组,计算每个班级每个科目的平均成绩 result = df.groupby(['班级', '科目'])['成绩'].mean().reset_index(name='平均成绩') print(result)
输出结果:
班级 科目 平均成绩 0 A班 数学 84.333333 1 B班 语文 90.000000
3 自定义聚合函数
除了内置的聚合函数,我们还可以使用自定义函数来对每个分组进行操作,你可以编写一个函数来计算每个分组的标准差,或者返回某个特定条件下的值。
定义一个自定义聚合函数 def custom_agg(group): return group['成绩'].std() # 计算标准差 按班级分组,应用自定义聚合函数 result = df.groupby('班级').apply(custom_agg).reset_index(name='标准差') print(result)
输出结果:
班级 标准差 0 A班 6.998542 1 B班 NaN
在这个例子中,我们定义了一个自定义聚合函数custom_agg
,它计算每个分组的成绩标准差,对于只有一个值的分组(如 B 班),标准差为NaN
。
3. 进阶用法
1 多个聚合函数
有时我们希望对同一分组应用多个聚合函数,Pandas 提供了一种简便的方法来实现这一点——使用字典或列表传递多个聚合函数。
按班级分组,同时计算平均成绩和最大成绩 result = df.groupby('班级').agg({'成绩': ['mean', 'max']}).reset_index() print(result)
输出结果:
班级 成绩 mean max 0 A班 84.333333 90 1 B班 90.000000 92
在这个例子中,我们使用了agg()
函数,并传入了一个字典,指定了对“成绩”列应用mean
和max
两个聚合函数。
2 复杂的聚合操作
如果你需要更复杂的聚合操作,比如对不同的列应用不同的聚合函数,可以使用agg()
函数并传递一个包含多个列和聚合函数的字典。
按班级分组,对不同列应用不同的聚合函数 result = df.groupby('班级').agg({ '成绩': 'mean', '姓名': 'count' }).reset_index() print(result)
输出结果:
班级 成绩 姓名 0 A班 84.333333 3 1 B班 90.000000 2
在这个例子中,我们对“成绩”列计算平均值,对“姓名”列计算计数。
4. 实用建议与技巧
1 提前规划分组策略
在实际应用中,提前规划好分组策略非常重要,你需要明确自己想要回答的问题,然后选择合适的分组依据,如果你想分析销售数据,可以按地区、产品类别、时间等维度进行分组。
2 注意内存使用
groupby
操作可能会产生大量的中间结果,尤其是在处理大数据集时,尽量避免不必要的分组操作,或者使用dask
等分布式计算库来处理大规模数据。
3 探索更多功能
Pandas 的groupby
还有很多其他功能,比如transform()
、filter()
等,你可以尝试探索这些功能,以满足更复杂的数据处理需求。
通过本文,我们详细介绍了 Pandas 中groupby
的用法,从基础概念到进阶技巧,再到一些实用的建议,希望这些内容能帮助
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。