您的位置:

探索Pandas GroupBy的奥秘

Pandas是Python中数据分析最重要的工具之一,而GroupBy是Pandas一个非常有用的函数,它具有重要的数据分析和操作功能。本文将会从多个角度解析Pandas GroupBy函数的功能和用法。

一、数据分组

GroupBy函数用于将DataFrame对象中的数据进行分组操作,首先需要先创建一个DataFrame:

import pandas as pd

data = {'name': ['John', 'Sam', 'John', 'Sam', 'Tom'],
        'age': [25, 30, 35, 40, 45],
        'sex': ['M', 'M', 'M', 'M', 'M'],
        'salary': [2000, 2500, 3000, 3500, 4000]}

df = pd.DataFrame(data)

然后,我们就可以通过GroupBy函数将数据按照需要的列进行分组。例如,我们首先按照“name”列对数据进行分组:

grouped = df.groupby('name')

这样就可以将数据按照名称分成三个组,分别是“John”、“Sam”和“Tom”。在以上代码中,GroupBy函数返回了一个DataFrameGroupBy对象,这个对象包含了分组后的数据,我们可以通过apply()、aggregate()、transform()等函数对这些分组后的数据进行操作。

二、使用apply()函数

apply()函数是GroupBy函数中常用的一个函数,它可以对分组后的数据进行自定义的操作。例如,我们可以通过以下代码对“salary”列求和:

grouped.apply(lambda x: x['salary'].sum())

以上代码会返回一个Series对象,包含了每个组的“salary”列的和。

此外,apply()函数还可以应用自定义的函数,例如,我们可以定义一个函数来计算每个组的平均工资:

def mean_salary(group):
    return group['salary'].mean()

grouped.apply(mean_salary)

以上代码将会返回一个DataFrame对象,包含了每个组的平均工资。

三、使用aggregate()函数

aggregate()函数可以对分组后的数据进行多个聚合操作,例如求和、均值、方差等。以下代码可以同时计算每个组的平均年龄和平均工资:

grouped.aggregate({'age': 'mean', 'salary': 'mean'})

以上代码会返回一个DataFrame对象,包含每个组的平均年龄和平均工资的值。

四、使用transform()函数

transform()函数是GroupBy函数的另一个常用函数,它可以对每个组中的数据进行组内操作,并且将结果返回到原始DataFrame中的相应位置。例如,我们可以将每个组的工资减去平均工资:

grouped.transform(lambda x: x['salary'] - x['salary'].mean())

以上代码将会返回一个Series对象,包含每个组所有数据的工资减去平均工资的值。

五、使用agg()函数

agg()函数是aggregate()函数的简化版,它可以对分组后的数据进行多个聚合操作,例如求和、均值、方差等。以下代码可以同时计算每个组的平均年龄和平均工资:

grouped.agg(['mean', 'std'])

以上代码将会返回一个DataFrame对象,包含每个组的平均年龄和平均工资的值,以及它们的标准差。

六、使用GroupBy对象获取分组信息

GroupBy对象包含了分组后的数据,也包含了分组的信息,可以通过以下代码获取分组后的所有组名:

grouped.groups.keys()

以上代码将会返回一个字典对象,包含了所有的组名。

除此之外,GroupBy对象还包含了其它有用的属性和方法,例如size、indices、get_group等。

七、使用多个键进行分组

当需要使用多个键进行分组时,可以在GroupBy函数中传入多个列名。例如,以下代码将会按照“name”和“sex”两个列进行分组:

grouped = df.groupby(['name', 'sex'])

通过以上代码,我们就可以将数据分成多个组,每个组都是由“name”和“sex”两个列值所确定的。

八、使用Categorical类型进行分组

有时候我们需要将数据按照分类值进行分组操作,可以使用Pandas中的Categorical类型。以下代码将会将年龄分成三个分类,然后根据分类进行分组:

df['age_group'] = pd.cut(df['age'], [20, 30, 40, 50])
grouped = df.groupby('age_group')

通过以上代码,我们将“age”列按照20-30、30-40、40-50三个区间进行了分类,并且将分类保存到了“age_group”列中。

九、使用自定义函数进行复杂分组

有时候需要根据自定义的规则进行复杂的分组操作,可以通过自定义函数来实现。以下代码将会根据每个人工资是否高于平均工资进行分组:

def higher_salary(group):
    return group['salary'].mean() < group['salary']

grouped = df.groupby(higher_salary)

以上代码使用了自定义的函数“higher_salary”,该函数返回一个Series对象,表示每个人的工资是否高于平均工资。然后,我们可以根据该函数的返回值进行分组操作。

总结

通过本文的介绍,我们了解到了Pandas GroupBy函数的基本功能和用法,包括数据分组、apply()、aggregate()、transform()、agg()等常用函数。此外,我们还介绍了如何使用GroupBy对象获取分组信息,以及如何使用多个键、Categorical类型和自定义函数进行复杂分组。