如何在 pandas 中使用 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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:
示例代码 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: