如何在 pandas 中使用 groupby 方法

如何在 pandas 中使用 groupby 方法

参考:pandas dataframe groupby

在数据分析中,groupby 是一个非常强大的功能,它允许你按照某些标准将数据分组,并对每个分组应用聚合函数,从而进行有效的数据分析和数据处理。在 pandas 中,groupby 功能是通过 DataFrame.groupby() 方法实现的。本文将详细介绍如何在 pandas 中使用 groupby 方法,并提供多个示例代码以帮助理解和掌握其用法。

基本概念

在 pandas 中,groupby 操作涉及以下几个步骤:
1. 分割:按照一定的规则将数据分割成组。
2. 应用:对每个组应用函数,通常是聚合、转换或过滤函数。
3. 组合:将处理结果组合成一个数据结构。

下面通过具体的代码示例来逐一解释这些步骤。

示例代码 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')
print(grouped)

# 对每个组应用 sum() 聚合函数
grouped_sum = grouped.sum()
print(grouped_sum)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 2:查看分组

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)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 3:分组后选择一个组

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

# 选择一个组
group_google = grouped.get_group('Google')
print(group_google)

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

# 对每个组应用多种聚合函数
grouped_agg = grouped.agg({'Sales': ['sum', 'mean', 'max']})
print(grouped_agg)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 5:使用自定义函数进行聚合

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

# 对每个组应用自定义聚合函数
grouped_custom = grouped.agg({'Sales': range_func})
print(grouped_custom)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 6:对分组后的结果进行排序

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

# 对每个组的销售总额进行求和
grouped_sum = grouped.sum()

# 对结果进行排序
sorted_groups = grouped_sum.sort_values(by='Sales', ascending=False)
print(sorted_groups)

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)

# 按 'Company' 列进行分组
grouped = df.groupby('Company')

# 定义一个过滤函数
def filter_func(x):
    return x['Sales'].sum() > 400

# 应用过滤
filtered_groups = grouped.filter(filter_func)
print(filtered_groups)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 8:分组后的转换

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 norm_by_data2(x):
    x['Sales'] /= x['Sales'].sum()
    return x

# 应用转换
transformed = grouped.transform(norm_by_data2)
print(transformed)

示例代码 9:多列分组

import pandas as pd

data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Department': ['HR', 'Tech', 'HR', 'Tech', 'HR', 'Tech'],
    'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
    'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)

# 按 'Company' 和 'Department' 列进行分组
grouped = df.groupby(['Company', 'Department'])

# 对每个组应用 sum() 聚合函数
grouped_sum = grouped.sum()
print(grouped_sum)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 10:分组后的索引操作

import pandas as pd

data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Department': ['HR', 'Tech', 'HR', 'Tech', 'HR', 'Tech'],
    'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
    'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)

# 按 'Company' 和 'Department' 列进行分组
grouped = df.groupby(['Company', 'Department'])

# 对每个组应用 sum() 聚合函数
grouped_sum = grouped.sum()

# 重置索引
grouped_sum_reset = grouped_sum.reset_index()
print(grouped_sum_reset)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 11:使用 apply() 方法进行复杂操作

import pandas as pd

data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Department': ['HR', 'Tech', 'HR', 'Tech', 'HR', 'Tech'],
    '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(df, n=1, column='Sales'):
    return df.sort_values(by=column, ascending=False).head(n)

# 对每个组应用函数
top_n = grouped.apply(top, n=1, column='Sales')
print(top_n)

示例代码 12:分组后的缺失值处理

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, 350]
}
df = pd.DataFrame(data)

# 按 'Company' 列进行分组
grouped = df.groupby('Company')

# 对每个组的销售额进行求和,忽略缺失值
grouped_sum = grouped.sum()
print(grouped_sum)

Output:

如何在 pandas 中使用 groupby 方法

示例代码 13:分组后的数据可视化

import pandas as pd
import matplotlib.pyplot as plt

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

# 对每个组的销售额进行求和
grouped_sum = grouped.sum()

# 绘制柱状图
grouped_sum.plot(kind='bar')
plt.show()

Output:

如何在 pandas 中使用 groupby 方法

示例代码 14:分组后的数据透视表

import pandas as pd

data = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Department': ['HR', 'Tech', 'HR', 'Tech', 'HR', 'Tech'],
    'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
    'Sales': [200, 120, 340, 124, 243, 350]
}
df = pd.DataFrame(data)

# 创建数据透视表
pivot_table = pd.pivot_table(df, values='Sales', index='Company', columns='Department', aggfunc=np.sum)
print(pivot_table)

示例代码 15:分组后的数据合并

import pandas as pd

data1 = {
    'Company': ['Google', 'Google', 'Microsoft', 'Microsoft', 'Facebook', 'Facebook'],
    'Employee': ['Sam', 'Charlie', 'Amy', 'Vanessa', 'Carl', 'Sarah'],
    'Sales': [200, 120, 340, 124, 243, 350]
}
df1 = pd.DataFrame(data1)

data2 = {
    'Company': ['Google', 'Microsoft', 'Facebook'],
    'Location': ['Mountain View', 'Redmond', 'Menlo Park']
}
df2 = pd.DataFrame(data2)

# 按 'Company' 列进行分组
grouped = df1.groupby('Company')

# 对每个组的销售额进行求和
grouped_sum = grouped.sum()

# 将结果与 df2 合并
merged = pd.merge(grouped_sum, df2, on='Company')
print(merged)

Output:

如何在 pandas 中使用 groupby 方法

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程