Pandas聚合与分组运算实战:从内置函数到自定义处理
本文深入解析Pandas中的聚合与分组运算。通过groupby实现数据分组,利用内置函数(如sum、mean)进行快速统计,并掌握使用agg()执行自定义聚合逻辑。文章还演示了多函数应用、列级指定运算、结果前缀添加,以及merge与transform在数据对齐与合并中的具体操作。
数据准备与分组基础
在进行聚合运算前,首先需要构建包含分类键(Key)与数值数据的数据集。利用 numpy 生成随机整数,结合字典结构创建 pandas.DataFrame 对象,是处理此类问题的标准起手式。
import numpy as np
import pandas as pd
# 构建包含分类键与数值列的数据集
dict_data = {
'key1': ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'],
'key2': ['one', 'two', 'three', 'one', 'two', 'three', 'one', 'two'],
'data1': np.random.randint(1, 10, 8),
'data2': np.random.randint(1, 10, 8)
}
df = pd.DataFrame(dict_data)
print(df)创建完成后,使用 groupby('key1') 指定分组依据,即可对数据进行聚合操作。例如,直接调用 .sum() 即可按 key1 的类别对数值列求和。
# 按 key1 分组并计算总和
df_grouped = df.groupby('key1').sum()
print(df_grouped)内置聚合函数的应用
Pandas 提供了丰富的内置聚合函数,可直接作用于 groupby 对象。这些函数包括求和(sum)、最大值(max)、最小值(min)、均值(mean)、计数(size)以及描述性统计(describe)等。
# 演示多种内置聚合函数
print(df.groupby('key1').sum())
print('*'*50)
print(df.groupby('key1').max())
print('*'*50)
print(df.groupby('key1').min())
print('*'*50)
print(df.groupby('key1').mean())
print('*'*50)
print(df.groupby('key1').size())
print('*'*50)
# 统计非 NaN 数据的数量
print(df.groupby('key1').count())
print('*'*50)
print(df.groupby('key1').describe())自定义聚合与 agg() 函数
当内置函数无法满足需求时,可以使用 agg() 函数传入自定义逻辑。自定义函数接收分组后的 DataFrame 或 Series,并返回聚合结果。
定义自定义聚合函数
以下示例定义了一个计算“极差平方差”的函数,并通过 agg() 应用:
# 自定义聚合函数:计算最大值平方与最小值平方的差
def peak_range(df):
return df.max()**2 - df.min()**2
# 使用 agg 应用自定义函数
print(df.groupby('key1').agg(peak_range))
# 使用 lambda 表达式进行更简单的聚合
print(df.groupby('key1').agg(lambda df: df.max() - df.min()))多函数应用与列索引重命名
在 agg() 中传入列表,可同时应用多个聚合函数。此时,结果 DataFrame 的列索引将自动包含函数名。若需自定义列名,可采用元组格式 ('新列名', 函数)。
# 应用多个聚合函数,并通过元组重命名特定列
print(df.groupby('key1').agg(['sum', 'std', 'mean', ('range', peak_range)]))指定列的特定聚合函数
利用字典格式,可以为不同的数值列指定不同的聚合逻辑:
# 指定 data1 使用 mean,data2 使用 sum
print(df.groupby('key1').agg({'data1': 'mean', 'data2': 'sum'}))结果处理与数据合并
聚合后的数据通常索引为分组键,若需将其与原始数据关联,需进行列名前缀处理及合并操作。
添加前缀与合并数据
使用 add_prefix() 为聚合结果的列名添加前缀,可避免合并时的列名冲突。随后通过 pd.merge() 将原始数据与聚合结果按分组键连接。
# 创建示例数据
dict_data = {
'key1': ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'],
'key2': ['one', 'two', 'three', 'one', 'two', 'three', 'one', 'two'],
'data1': np.random.randint(1, 10, 8),
'data2': np.random.randint(1, 10, 8)
}
df = pd.DataFrame(dict_data)
# 分组求和并添加前缀
k1_sum = df.groupby('key1').sum().add_prefix('sum_')
print(k1_sum)
# 将聚合结果与原始数据合并
# 注意:left_on 指定原始数据的键,right_index 指定聚合结果的索引
result_merged = pd.merge(df, k1_sum, left_on='key1', right_index=True)
print(result_merged)transform 函数的对齐特性
transform() 与 agg() 不同,它返回的结果索引与原始数据完全一致。这使得聚合结果可以直接作为新列添加到原始 DataFrame 中,无需额外的合并操作。
# 使用 transform 计算总和,结果按原始顺序排列
k1_sum_tf = df.groupby('key1').transform(np.sum).add_prefix('sum_')
# 将 transform 结果直接赋值给原始 DataFrame 的新列
df[k1_sum_tf.columns] = k1_sum_tf
print(df)通过上述示例,可以看出 transform 在需要将聚合统计值“广播”回原始数据行时的便利性。以上就是Pandas聚合与分组运算的详细内容,更多关于Python数据处理与数据分析的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













