Pandas GroupBy 详解
Pandas 是一个强大的 Python 数据分析库,它提供了大量的功能来处理和分析数据。其中,GroupBy 是一个非常重要的功能,它允许你按照某些标准将数据分组,并对每个分组应用聚合函数,从而进行有效的数据分析和统计。本文将详细介绍 Pandas 中的 GroupBy 操作,并通过多个示例代码展示其用法。
1. GroupBy 基础
在 Pandas 中,groupby
函数可以根据一个或多个键(可以是列名、函数、索引或索引的层级)分割 pandas 对象。然后,可以对分组数据进行聚合、转换或过滤操作。
示例代码 1:基本的 GroupBy 操作
import pandas as pd
# 创建一个示例 DataFrame
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 对每个分组应用 sum 函数
sum_df = grouped.sum()
print(sum_df)
Output:
示例代码 2:多列分组
import pandas as pd
# 创建一个示例 DataFrame
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Revenue': [200, 240, 310, 300, 215, 410]
}
df = pd.DataFrame(data)
# 按 'Company' 和 'Department' 列进行分组
grouped = df.groupby(['Company', 'Department'])
# 对每个分组应用 mean 函数
mean_df = grouped.mean()
print(mean_df)
Output:
2. 聚合操作
聚合操作是 GroupBy 中最常见的操作之一,它允许你对组内的数据进行各种数学计算。
示例代码 3:使用 agg() 方法进行多种聚合
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 使用 agg 方法进行多种聚合
agg_df = grouped['Sales'].agg(['sum', 'mean', 'max'])
print(agg_df)
Output:
示例代码 4:自定义聚合函数
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 定义一个自定义聚合函数
def range_func(series):
return series.max() - series.min()
# 使用自定义函数进行聚合
range_df = grouped['Sales'].agg(range_func)
print(range_df)
Output:
3. 转换操作
GroupBy 的转换操作允许你对组内的数据进行转换,而不改变索引。
示例代码 5:使用 transform() 方法标准化数据
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 定义一个标准化函数
def standardize(series):
return (series - series.mean()) / series.std()
# 使用 transform 方法进行数据标准化
standardized_sales = grouped['Sales'].transform(standardize)
df['Standardized Sales'] = standardized_sales
print(df)
Output:
示例代码 6:填充缺失值
import pandas as pd
import numpy as np
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, np.nan, 340, 124, 243, np.nan]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 使用 transform 方法填充缺失值
filled_sales = grouped['Sales'].transform(lambda x: x.fillna(x.mean()))
df['Filled Sales'] = filled_sales
print(df)
Output:
4. 过滤操作
GroupBy 的过滤操作允许你根据组的属性丢弃某些组。
示例代码 7:过滤操作
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 过滤出销售总额大于 400 的公司
filtered_df = grouped.filter(lambda x: x['Sales'].sum() > 400)
print(filtered_df)
Output:
5. 应用操作
GroupBy 的 apply 方法允许你将一个函数应用到每个组,然后将结果合并回一个数据结构中。
示例代码 8:使用 apply() 方法
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 定义一个函数,返回销售额最高的员工信息
def top_salesperson(df):
return df[df['Sales'] == df['Sales'].max()]
# 使用 apply 方法
top_salesperson_df = grouped.apply(top_salesperson)
print(top_salesperson_df)
示例代码 9:复杂的 apply() 操作
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 定义一个函数,返回销售额最高和最低的员工信息
def top_and_bottom_salesperson(df):
return df[df['Sales'].isin([df['Sales'].max(), df['Sales'].min()])]
# 使用 apply 方法
top_bottom_salesperson_df = grouped.apply(top_and_bottom_salesperson)
print(top_bottom_salesperson_df)
6. GroupBy 对象的属性和方法
GroupBy 对象有很多有用的属性和方法,可以帮助我们更好地理解和操作分组数据。
示例代码 10:GroupBy 对象的属性
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 打印分组的键
print(grouped.groups)
# 打印分组的数量
print(grouped.ngroups)
Output:
示例代码 11:GroupBy 对象的方法
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按 'Company' 列进行分组
grouped = df.groupby('Company')
# 获取每个分组的第一行
print(grouped.first())
# 获取每个分组的最后一行
print(grouped.last())
# 获取每个分组的大小
print(grouped.size())
Output:
7. GroupBy 的高级用法
除了上述基本操作外,GroupBy 还有很多高级用法,可以帮助我们进行更复杂的数据分析。
示例代码 12:分组键为函数
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 定义一个函数,根据销售额的大小分组
def group_by_sales(sales):
if sales < 200:
return 'Low'
elif sales < 300:
return 'Medium'
else:
return 'High'
# 按销售额进行分组
grouped = df.groupby(group_by_sales)
# 对每个分组应用 sum 函数
sum_df = grouped.sum()
print(sum_df)
Output:
示例代码 13:分组键为索引级别
import pandas as pd
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Revenue': [200, 240, 310, 300, 215, 410]
}
df = pd.DataFrame(data)
# 将 'Company' 和 'Department' 列设置为索引
df.set_index(['Company', 'Department'], inplace=True)
# 按索引的第一级进行分组
grouped = df.groupby(level=0)
# 对每个分组应用 sum 函数
sum_df = grouped.sum()
print(sum_df)
Output:
示例代码 14:使用 pd.Grouper 对象进行分组
import pandas as pd
# 创建一个时间序列 DataFrame
date_range = pd.date_range(start='2020-01-01', end='2020-12-31', freq='D')
df = pd.DataFrame({
'Date': date_range,
'Value': pd.np.random.rand(len(date_range))
})
# 将 'Date' 列设置为索引
df.set_index('Date', inplace=True)
# 按月份进行分组
grouped = df.groupby(pd.Grouper(freq='M'))
# 对每个分组应用 mean 函数
mean_df = grouped.mean()
print(mean_df)
以上就是 Pandas 中 GroupBy 操作的详细介绍,希望对你有所帮助。在实际的数据分析工作中,GroupBy 是一个非常强大的工具,可以帮助我们快速地对数据进行分组和聚合,从而得到有价值的信息。