Pandas GroupBy 详解

Pandas GroupBy 详解

参考:pandas groupby

Pandas 是一个强大的 Python 数据分析库,它提供了大量的功能来处理和分析数据。其中,groupbyPandas 中一个非常重要且常用的功能,它允许你按照某些标准将数据分组,并对每个分组应用聚合函数,从而进行有效的数据分析和统计。本文将详细介绍 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas 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)

# 按公司分组并获取每组的第一个条目
grouped = df.groupby('Company')
first_entry = grouped.first()
print(first_entry)

Output:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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:

Pandas GroupBy 详解

示例代码 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 详解

以上示例代码展示了如何使用 Pandas 的 groupby 功能进行各种数据处理和分析任务。通过这些示例,你可以看到 groupby 不仅可以用来聚合数据,还可以用于数据转换、过滤、排序和更多高级数据操作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程