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类型和自定义函数进行复杂分组。