Pandas GroupBy 详解

Pandas GroupBy 详解

参考: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:

Pandas GroupBy 详解

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

Pandas GroupBy 详解

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:

Pandas GroupBy 详解

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

Pandas GroupBy 详解

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:

Pandas GroupBy 详解

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

Pandas GroupBy 详解

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:

Pandas GroupBy 详解

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:

Pandas GroupBy 详解

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

Pandas GroupBy 详解

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:

Pandas GroupBy 详解

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

Pandas GroupBy 详解

示例代码 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 是一个非常强大的工具,可以帮助我们快速地对数据进行分组和聚合,从而得到有价值的信息。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程