Pandas GroupBy 详解
Pandas 是一个强大的 Python 数据分析库,它提供了大量的功能来处理和分析数据。其中,groupby
是 Pandas 中一个非常重要且常用的功能,它允许你按照某些标准将数据分组,并对每个分组应用聚合函数,从而进行有效的数据分析和统计。本文将详细介绍 Pandas 中的 groupby
功能,包括其基本用法和高级应用,并通过多个示例代码进行演示。
基本概念
在 Pandas 中,groupby
功能可以被认为是一种分割-应用-组合的过程:
– 分割:数据在某个或某些键上被分割成多个组。
– 应用:对每个分组独立应用函数,通常是聚合、转换或过滤函数。
– 组合:将处理结果组合成一个数据结构。
示例代码 1:基本的 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)
# 按公司分组并计算每个公司的平均销售额
grouped = df.groupby('Company')
average_sales = grouped.mean()
print(average_sales)
示例代码 2:多列分组
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Revenue': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司和部门分组
grouped = df.groupby(['Company', 'Department'])
total_revenue = grouped.sum()
print(total_revenue)
Output:
示例代码 3:聚合多个函数
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司分组并同时计算总和和平均值
grouped = df.groupby('Company')
summary = grouped['Sales'].agg(['sum', 'mean'])
print(summary)
Output:
示例代码 4:自定义聚合函数
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 定义一个计算范围的函数
def range_func(series):
return series.max() - series.min()
# 按公司分组并应用自定义函数
grouped = df.groupby('Company')
range_of_sales = grouped['Sales'].agg(range_func)
print(range_of
示例代码 5:过滤分组数据
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 定义过滤条件,选择平均销售额大于 250 的公司
def filter_func(x):
return x['Sales'].mean() > 250
filtered_groups = df.groupby('Company').filter(filter_func)
print(filtered_groups)
Output:
示例代码 6:转换分组数据
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 对销售数据进行标准化
def normalize(x):
return (x - x.mean()) / x.std()
normalized_sales = df.groupby('Company')['Sales'].transform(normalize)
df['Normalized Sales'] = normalized_sales
print(df)
Output:
示例代码 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)
# 按公司分组并获取每组的第一个条目
grouped = df.groupby('Company')
first_entry = grouped.first()
print(first_entry)
Output:
示例代码 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)
# 定义一个函数,返回销售额大于 150 的记录
def high_sales(group):
return group[group['Sales'] > 150]
high_sales_groups = df.groupby('Company').apply(high_sales)
print(high_sales_groups)
示例代码 9:分组并排序
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)
# 按公司分组并按销售额排序
sorted_groups = df.groupby('Company').apply(lambda x: x.sort_values('Sales'))
print(sorted_groups)
示例代码 10:分组键作为索引
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)
# 按公司分组,设置 as_index=False 以保持原始索引
grouped = df.groupby('Company', as_index=False)
grouped_mean = grouped.mean()
print(grouped_mean)
高级应用
在掌握了基本的 groupby
操作后,我们可以探索一些更高级的用法,比如多级索引的处理、复杂的聚合操作以及与其他 Pandas 功能的结合使用。
示例代码 11:多级索引分组
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司和部门分组,创建多级索引
grouped = df.groupby(['Company', 'Department'])
total_sales = grouped.sum()
print(total_sales)
Output:
示例代码 12:重置索引
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司和部门分组,然后重置索引
grouped = df.groupby(['Company', 'Department']).sum().reset_index()
print(grouped)
Output:
示例代码 13:聚合后重命名列
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司分组并聚合,然后重命名聚合后的列
grouped = df.groupby('Company').agg(Total_Sales=('Sales', 'sum'), Average_Sales=('Sales', 'mean'))
print(grouped)
Output:
示例代码 14:组内排序和取最大值
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
'Sales': [200, 240, 340, 124, 243, 350]
}
df = pd.DataFrame(data)
# 按公司分组,组内按销售额排序,然后取每组销售额最大的记录
top_sales = df.groupby('Company').apply(lambda x: x.nlargest(1, 'Sales'))
print(top_sales)
示例代码 15:计算累计和
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司分组并计算每组的累计销售额
cumulative_sales = df.groupby('Company')['Sales'].cumsum()
df['Cumulative Sales'] = cumulative
示例代码 16:分组后的数据透视表
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 使用数据透视表按公司和部门分组并计算销售总额
pivot_table = pd.pivot_table(df, values='Sales', index='Company', columns='Department', aggfunc='sum')
print(pivot_table)
Output:
示例代码 17:分组后的数据透视表(多聚合函数)
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Department': ['Sales', 'Marketing', 'Sales', 'Marketing', 'Sales', 'Marketing'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 使用数据透视表按公司和部门分组并同时计算销售总额和平均值
pivot_table = pd.pivot_table(df, values='Sales', index='Company', columns='Department', aggfunc=['sum', 'mean'])
print(pivot_table)
Output:
示例代码 18:分组后的时间序列重采样
import pandas as pd
import numpy as np
# 创建示例数据
date_rng = pd.date_range(start='1/1/2022', end='1/10/2022', freq='D')
data = {
'Company': ['Google'] * 10,
'Sales': np.random.randint(100, 200, size=(10))
}
df = pd.DataFrame(data, index=date_rng)
# 按公司分组并对时间序列数据进行月度重采样
monthly_sales = df.groupby('Company').resample('M').sum()
print(monthly_sales)
示例代码 19:分组后的异常值检测
import pandas as pd
# 创建示例数据
data = {
'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
'Sales': [200, 240, 310, 200, 215, 300]
}
df = pd.DataFrame(data)
# 按公司分组并检测每组中的异常值
def detect_outliers(group):
mean = group.mean()
std = group.std()
outliers = group[(group < mean - 2 * std) | (group > mean + 2 * std)]
return outliers
outliers = df.groupby('Company')['Sales'].apply(detect_outliers)
print(outliers)
Output:
示例代码 20:分组后的数据合并
import pandas as pd
# 创建示例数据
data1 = {
'Company': ['Google', 'Microsoft', 'Facebook'],
'Headquarters': ['Mountain View', 'Redmond', 'Menlo Park']
}
df1 = pd.DataFrame(data1)
data2 = {
'Company': ['Google', 'Microsoft', 'Facebook'],
'Founded': [1998, 1975, 2004]
}
df2 = pd.DataFrame(data2)
# 按公司分组后合并两个数据框
merged_data = pd.merge(df1, df2, on='Company')
print(merged_data)
Output:
以上示例代码展示了如何使用 Pandas 的 groupby
功能进行各种数据处理和分析任务。通过这些示例,你可以看到 groupby
不仅可以用来聚合数据,还可以用于数据转换、过滤、排序和更多高级数据操作。