Data Analysis

Pandas分组与聚合详解:完整指南

Spread the love

Pandas是一个强大的Python库,用于数据处理和分析。其最常用的功能之一是分组数据并执行聚合计算。本文探讨了使用groupby()方法高效计算分组数据后聚合和的方法,针对不同复杂程度和所需输出格式提供了多种解决方案。

目录:

使用groupby()进行基本求和

分组后计算列总和最简单的方法是直接使用groupby()sum()方法:


import pandas as pd

data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
        'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)

# 按'Group'分组并对'Value'求和
grouped_sum = df.groupby('Group')['Value'].sum()
print(grouped_sum)

这简洁地生成了一个Series,包含每组’Value’的总和。

使用agg()进行多重聚合

agg()方法允许同时高效地计算多个聚合统计数据。当您需要的不只是总和时,这一点尤其有用:


import pandas as pd

data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
        'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)

# 计算每组的总和、平均值和计数
aggregated = df.groupby('Group')['Value'].agg(['sum', 'mean', 'count'])
print(aggregated)

这一行代码计算了每组’Value’的总和、平均值和计数,结果是一个DataFrame。

使用apply()进行自定义聚合

对于需要自定义聚合逻辑的更复杂场景,apply()方法提供了最大的灵活性。您可以定义一个函数来执行任何所需的计算:


import pandas as pd
import numpy as np

data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
        'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)

def custom_agg(x):
    return pd.Series({'sum': x.sum(), 'range': x.max() - x.min()})

# 应用自定义聚合函数
result = df.groupby('Group')['Value'].apply(custom_agg).reset_index()
print(result)

在这里,自定义函数计算每组的总和和范围。

使用groupby()cumsum()进行累积求和

要在每组内获得累积和,请将groupby()cumsum()方法结合使用:


import pandas as pd

data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
        'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)

# 计算每组的累积和
df['Cumulative Sum'] = df.groupby('Group')['Value'].cumsum()
print(df)

这会添加一个新列,显示每组内的运行总计。

使用pivot_table()重塑数据

对于更直观且易于分析的聚合数据表示,尤其是在处理多个分组变量时,请使用pivot_table()


import pandas as pd

data = {'Group': ['A', 'A', 'B', 'B', 'B', 'A'],
        'Category': ['X', 'Y', 'X', 'Y', 'Z', 'X'],
        'Value': [10, 20, 15, 5, 25, 30]}
df = pd.DataFrame(data)

pivot_table = pd.pivot_table(df, values='Value', index='Group', columns='Category', aggfunc='sum', fill_value=0)
print(pivot_table)

这将创建一个汇总数据的透视表,使其更容易比较每组中不同类别间的总和。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注