Python Pandas分组操作:transform与apply的使用

大家好,在数据分析中,分组操作是处理数据的常用手段。Python的Pandas库提供了丰富的分组操作功能,其中 transformapply 是两个非常重要的工具,它们可以帮助我们在分组后对数据进行转换和处理。本文将介绍 transformapply 的运用,探讨它们的区别与应用场景,并通过具体的示例代码展示其在实际工作中的使用方法。

1.Pandas分组操作概述

在使用Pandas进行数据分析时,分组操作通常与 groupby 函数结合使用。groupby 可以将数据集按照某一列或多列进行分组,并对每个分组应用某种操作,例如计算平均值、求和等。transformapply 是两种在分组后进行数据转换的常用方法,它们可以灵活地对分组数据进行进一步处理。

transform:对每个分组执行某种操作,并将结果"广播"回原始数据结构。这意味着结果的形状与原始数据相同。transform 适用于需要在分组级别上执行计算并将结果与原始数据对齐的情况。

apply:允许我们在每个分组上应用任意的函数,返回的结果可以是标量、系列或数据帧。apply 提供了更大的灵活性,适用于需要对分组数据进行复杂操作的情况。

2.使用 transform 进行分组转换

transform 函数主要用于对分组数据进行逐元素的转换操作,返回的结果具有与原始数据相同的索引。

2.1 按组计算均值并进行转换

假设有一组学生的成绩数据,并希望计算每个班级的平均成绩,并将其分配给每个学生。

python 复制代码
import pandas as pd

# 创建一个数据框
data = {'班级': ['A', 'A', 'B', 'B', 'C', 'C'],
        '学生': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
        '成绩': [85, 90, 78, 82, 88, 92]}

df = pd.DataFrame(data)

# 按班级分组,并计算每个班级的平均成绩
df['班级均分'] = df.groupby('班级')['成绩'].transform('mean')

print(df)

运行以上代码,输出结果为:

python 复制代码
  班级  学生  成绩  班级均分
0  A  张三  85  87.5
1  A  李四  90  87.5
2  B  王五  78  80.0
3  B  赵六  82  80.0
4  C  钱七  88  90.0
5  C  孙八  92  90.0

在这个示例中,transform 函数计算了每个班级的平均成绩,并将结果"广播"回原始数据框,生成了新的 班级均分 列。

2.2 按组标准化数据

transform 也可以用于对分组数据进行标准化处理。例如,对每个班级的成绩进行标准化,使得每个班级的成绩均值为0,标准差为1。

python 复制代码
import pandas as pd

# 创建一个数据框
data = {'班级': ['A', 'A', 'B', 'B', 'C', 'C'],
        '学生': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
        '成绩': [85, 90, 78, 82, 88, 92]}

df = pd.DataFrame(data)

# 定义标准化函数
def standardize(x):
    return (x - x.mean()) / x.std()

# 按班级分组,并对成绩进行标准化
df['标准化成绩'] = df.groupby('班级')['成绩'].transform(standardize)

print(df)

运行以上代码,输出结果为:

python 复制代码
  班级  学生  成绩  标准化成绩
0  A  张三  85  -0.707107
1  A  李四  90   0.707107
2  B  王五  78  -0.707107
3  B  赵六  82   0.707107
4  C  钱七  88  -0.707107
5  C  孙八  92   0.707107

在这个示例中,transform 函数结合自定义的 standardize 函数,对每个班级的成绩进行了标准化处理。

3.使用 apply 进行分组操作

transform 相比,apply 提供了更大的灵活性,它可以对每个分组应用自定义函数,并可以返回各种形式的结果。

3.1 按组计算成绩的范围

假设计算每个班级的成绩范围(最大值与最小值之差),并将结果添加到原始数据框中。

python 复制代码
import pandas as pd

# 创建一个数据框
data = {'班级': ['A', 'A', 'B', 'B', 'C', 'C'],
        '学生': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
        '成绩': [85, 90, 78, 82, 88, 92]}

df = pd.DataFrame(data)

# 定义计算范围的函数
def score_range(x):
    return x.max() - x.min()

# 按班级分组,并计算成绩范围
df['成绩范围'] = df.groupby('班级')['成绩'].apply(score_range)

print(df)

运行以上代码,输出结果为:

python 复制代码
  班级  学生  成绩  成绩范围
0  A  张三  85    5
1  A  李四  90    5
2  B  王五  78    4
3  B  赵六  82    4
4  C  钱七  88    4
5  C  孙八  92    4

在这个示例中,apply 函数计算了每个班级的成绩范围,并将结果添加到了原始数据框中。

3.2 对分组数据应用自定义函数

apply 还可以用于对分组数据应用复杂的自定义函数。为每个班级创建一个新的列,显示每个学生成绩在班级中的相对排名。

python 复制代码
import pandas as pd

# 创建一个数据框
data = {'班级': ['A', 'A', 'B', 'B', 'C', 'C'],
        '学生': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
        '成绩': [85, 90, 78, 82, 88, 92]}

df = pd.DataFrame(data)

# 定义相对排名函数
def rank_within_group(x):
    return x.rank(pct=True)

# 按班级分组,并计算相对排名
df['相对排名'] = df.groupby('班级')['成绩'].apply(rank_within_group)

print(df)

运行以上代码,输出结果为:

python 复制代码
  班级  学生  成绩  相对排名
0  A  张三  85    0.5
1  A  李四  90    1.0
2  B  王五  78    0.5
3  B  赵六  82    1.0
4  C  钱七  88    0.5
5  C  孙八  92    1.0

在这个示例中,通过 apply 函数计算了每个学生在班级中的相对排名,结果存储在新的 相对排名 列中。

综上所述,在数据分析中,Python Pandas中的 transformapply 是处理分组数据的两个强大工具。transform 适用于逐元素转换,返回的结果与原始数据框形状一致,常用于计算分组均值、标准化等操作。而 apply 提供了更大的灵活性,可以对分组数据应用自定义函数,返回的结果可以是标量、系列或数据帧,适合复杂的数据处理任务。

相关推荐
luanma15098018 分钟前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默20 分钟前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
剑穗挂着新流苏31223 分钟前
117_PyTorch 实战:利用训练好的模型进行单张图片验证
人工智能·python·深度学习
Lethehong1 小时前
Python Selenium全栈指南:从自动化入门到企业级实战
python·selenium·测试工具·自动化
kyriewen111 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
智算菩萨1 小时前
MP3音频编码原理深度解析与Python全参数调优实战:从心理声学模型到LAME编码器精细控制
android·python·音视频
娇娇yyyyyy2 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt
豆豆的java之旅2 小时前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构
sthnyph2 小时前
QT开发:事件循环与处理机制的概念和流程概括性总结
开发语言·qt
qq_452396232 小时前
【模型手术室】第四篇:全流程实战 —— 使用 LLaMA-Factory 开启你的第一个微调任务
人工智能·python·ai·llama