问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Pandas数据聚合:groupby与agg

创作时间:
作者:
@小白创作中心

Pandas数据聚合:groupby与agg

引用
1
来源
1.
https://developer.aliyun.com/article/1646336

在数据分析领域,Pandas库的groupby和agg函数是进行数据聚合操作的重要工具。本文将从基础概念、常见问题、常见报错及解决方案等方面,由浅入深地介绍如何使用Pandas的groupby和agg方法,并通过代码案例进行详细解释。

基础概念

groupby 方法

groupby是Pandas中最常用的分组工具之一。它允许我们将DataFrame按照一个或多个列进行分组,从而可以对每个分组执行各种聚合操作。groupby返回的是一个GroupBy对象,该对象本身并不包含任何聚合结果,而是提供了一个接口来应用各种聚合函数。

agg 方法

agg(aggregate的缩写)用于对分组后的数据进行聚合计算。它可以接受多种类型的参数,如字符串表示的函数名、自定义函数、字典等。通过agg,我们可以一次性对多个列应用不同的聚合函数,极大地提高了数据处理的灵活性和效率。

单列聚合

基本用法

对于单列数据的聚合,通常我们会先使用groupby方法指定分组依据,然后调用agg方法并传入具体的聚合函数。常见的聚合函数包括sum()、mean()、count()、min()、max()等。

常见问题

  1. 重复值处理:当分组键存在重复值时,默认情况下会根据这些重复值创建新的分组。如果希望去除重复项后再进行分组,可以在groupby之前使用drop_duplicates()。
  2. 缺失值处理:默认情况下,groupby会忽略含有NaN值的行。可以通过设置dropna=False参数来保留这些行。
  3. 性能优化:对于大规模数据集,直接使用groupby可能会导致性能瓶颈。此时可以考虑使用更高效的替代方案,如pivot_table或crosstab。

常见报错及解决方案

  • KeyError: 如果指定的分组键不存在于DataFrame中,会抛出此异常。检查拼写是否正确,并确认列确实存在于DataFrame中。
  • TypeError: 当尝试对非数值类型的数据应用某些聚合函数(如求和)时,可能会遇到类型错误。确保所有元素属于同一类型,或者使用适当的转换函数。

代码案例

import pandas as pd
# 创建示例数据
data = {
   'department': ['HR', 'Tech', 'HR', 'Tech'],
        'salary': [6000, 8000, 7000, 9000],
        'experience': [3, 5, 4, 6]}
df = pd.DataFrame(data)
# 按部门分组并计算薪水总和
grouped_salary_sum = df.groupby('department')['salary'].sum()
print("按部门分组并计算薪水总和:")
print(grouped_salary_sum)

多列聚合

基本用法

多列聚合是指同时对多个列进行分组和聚合计算。这在实际应用中非常有用,例如统计各部门员工的平均工资和最大工作经验。同样使用groupby和agg方法,只需传入一个包含多个列名的列表即可。

常见问题

  1. 优先级设定:明确各列之间的优先关系非常重要。通常按照从高到低的重要性依次列出列名。
  2. 不同类型组合:当涉及不同数据类型的列一起聚合时(如数字与日期),应确保逻辑上的合理性。
  3. 性能考虑:随着参与聚合的列数增加,计算量也会相应增大。对于大规模数据集,优化查询效率成为关键。

常见报错及解决方案

  • KeyError: 类似于单列聚合时的问题,但更复杂的是可能存在依赖关系。仔细核对每一步骤所用到的列名及其相互间的关联性。
  • MemoryError: 对于特别大的数据集,在内存中直接进行多列聚合可能导致内存不足。此时可考虑分批次处理或利用数据库等外部存储系统。

代码案例

import pandas as pd
# 创建示例数据
data = {
   'department': ['HR', 'Tech', 'HR', 'Tech'],
        'salary': [6000, 8000, 7000, 9000],
        'experience': [3, 5, 4, 6]}
df = pd.DataFrame(data)
# 按部门分组并计算薪水总和和经验最大值
multi_agg_result = df.groupby('department').agg({
   'salary': 'sum', 'experience': 'max'})
print("按部门分组并计算薪水总和和经验最大值:")
print(multi_agg_result)

高级聚合

自定义聚合函数

除了内置的聚合函数外,agg还支持用户自定义函数。这对于实现特定业务逻辑非常有帮助。自定义函数需要接收一个Series作为输入,并返回一个标量值。

多个聚合函数

有时我们需要对同一列应用多个聚合函数。agg允许我们通过传递一个包含多个函数的列表来实现这一点。这样可以一次性获取多个聚合结果,而不需要多次调用agg。

代码案例

import pandas as pd
# 创建示例数据
data = {
   'department': ['HR', 'Tech', 'HR', 'Tech'],
        'salary': [6000, 8000, 7000, 9000],
        'experience': [3, 5, 4, 6]}
df = pd.DataFrame(data)
# 定义自定义聚合函数
def custom_agg(series):
    return series.max() - series.min()
# 按部门分组并应用自定义聚合函数
custom_agg_result = df.groupby('department')['salary'].agg(custom_agg)
print("按部门分组并应用自定义聚合函数:")
print(custom_agg_result)
# 对同一列应用多个聚合函数
multi_func_agg_result = df.groupby('department')['salary'].agg(['sum', 'mean'])
print("\n对同一列应用多个聚合函数:")
print(multi_func_agg_result)

总结

通过对Pandasgroupby和agg的学习,我们可以更好地理解和运用这一强大工具来满足各种数据分析需求。无论是简单的单列聚合还是复杂的多列联合聚合,掌握其中的技巧和注意事项都能让我们更加高效准确地处理数据。希望本文能够帮助读者解决在实际工作中遇到的相关问题,并提高工作效率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号