当前位置: 首页 > article >正文

Pandas 中 transform() 与 apply() 的联系与区别

Pandas 中 transform() 与 apply() 的联系与区别

在 Pandas 中,transform()apply() 都是非常常用的方法,用于对数据进行分组和变换。这两个方法提供了强大的灵活性来操作数据,但它们的用途和返回结果有所不同。本文将详细探讨 transform()apply() 之间的联系与区别,以及如何在实际应用中选择合适的方法。

transform() 方法

transform() 方法通常用于在分组后对每组数据进行转换操作,并将结果返回给原始 DataFrame 中的每个元素。它的关键特性在于:

  • 返回结果与原 DataFrame 的大小相同。每个组的操作结果会回填到原始数据的位置上。
  • 保持原 DataFrame 的索引结构,因此非常适合用来新增列。

例如,我们想计算每个城市的销售额的平均值,并将结果作为一个新列添加到原始 DataFrame 中:

import pandas as pd

# 创建数据集
data = {
    '城市': ['北京', '上海', '广州', '北京', '广州', '上海', '北京'],
    '销售额': [100, 200, 150, 80, 120, 250, 90],
    '月份': ['一月', '一月', '一月', '二月', '二月', '二月', '三月']
}

df = pd.DataFrame(data)

# 使用 transform 计算平均销售额
df['平均销售额'] = df.groupby('城市')['销售额'].transform('mean')
print(df)

输出结果:

   城市  销售额  月份   平均销售额
0  北京  100  一月   90.0
1  上海  200  一月  225.0
2  广州  150  一月  135.0
3  北京   80  二月   90.0
4  广州  120  二月  135.0
5  上海  250  二月  225.0
6  北京   90  三月   90.0
apply() 方法

apply() 方法允许对每个组进行更复杂的操作,它可以返回任意形状的结果,因此非常灵活。apply() 方法可以对每组执行自定义的函数,并且可以返回标量、Series 或者 DataFrame。然而,apply() 的灵活性也带来了它的一些限制,比如其返回的结果可能与原始数据的索引不一致,因此在赋值时可能需要额外的处理。

例如,我们对每个城市的销售额进行标准化处理:

def standardize(group):
    return (group - group.mean()) / group.std()

# 使用 apply 进行标准化处理
df['标准化销售额'] = df.groupby('城市')['销售额'].apply(standardize).reset_index(level=0, drop=True)
print(df)

输出结果:

   城市  销售额  月份   平均销售额  标准化销售额
0  北京  100  一月   90.0  0.730297
1  上海  200  一月  225.0 -0.707107
2  广州  150  一月  135.0  0.707107
3  北京   80  二月   90.0 -1.095445
4  广州  120  二月  135.0 -0.707107
5  上海  250  二月  225.0  0.707107
6  北京   90  三月   90.0  0.365148

在这个例子中,我们使用 apply() 对每个城市的销售额进行了标准化处理,并通过 reset_index() 来确保返回的结果与原 DataFrame 的索引匹配。

联系与区别
  • 返回结果的形状

    • transform() 返回的结果与原数据的形状相同,因此适合用于对原 DataFrame 新增列。
    • apply() 的返回结果可以是标量、SeriesDataFrame,具有更高的灵活性。
  • 索引的一致性

    • transform() 保持原数据的索引结构一致,结果可以直接赋值到原 DataFrame 中。
    • apply() 的返回结果索引不一定与原数据匹配,因此在赋值时可能需要重置索引。
  • 适用场景

    • transform() 适用于需要对每组数据进行简单的转换操作,并将结果回填到原始数据中的场景。例如计算每组的均值、标准差等。
    • apply() 适用于需要对每组数据进行更复杂的操作,并且不局限于返回与原数据大小相同结果的场景。它可以返回任意结构的结果,灵活性更强。
如何选择?

在实际应用中,选择使用 transform() 还是 apply() 取决于具体的需求:

  • 如果你需要对每个组的数据进行简单的运算,并且希望结果与原数据大小一致,选择 transform()。例如,计算每组的均值并回填到原数据中。
  • 如果你需要对每个组执行更复杂的自定义操作,或者返回的结果结构与原数据不一致,选择 apply()。例如,对每组进行标准化,或者根据某些条件对每组返回不同类型的结果。
总结

transform()apply() 是 Pandas 中处理分组数据的两个重要方法。transform() 更适合用于简单的转换操作,而 apply() 则具有更大的灵活性,适合用于复杂的数据处理需求。在选择时,需要根据具体任务的复杂性和结果的需求来决定使用哪个方法。


http://www.kler.cn/a/349353.html

相关文章:

  • 本地拉取Docker镜像打包导入远程服务器
  • k8s集群版本升级
  • vue3在setup中引入本地图片
  • 基于BERT的深度强化学习求解图上的组合优化问题(未完)
  • [LeetCode] 295. 数据流的中位数
  • 大厂面试真题-CPU飙升问题怎么定位
  • 交通路口智能监测平台实现
  • 呼兰:从程序员到脱口秀演员的双面人生
  • [Linux#62][TCP] 首位长度:封装与分用 | 序号:可靠性原理 | 滑动窗口:流量控制
  • 图的应用——关键路径
  • 深度优先搜索 - 岛屿最大面积
  • linux线程 | 同步与互斥(上)
  • Linux:信号保存与处理
  • 无人机与卫星光伏踏勘,谁会引领未来?
  • UE5蓝图学习笔记玩家碰撞触发死亡加一秒黑屏
  • 游​卡​三​面​​牧​原​三​面​​商​汤​一​面​​W​X​G​一​面
  • Vue GridLayout 入门指南
  • FunASR离线文件转写服务开发指南-debian-10.13
  • SpringBoot构建的健康管理推荐引擎
  • Vue 2 和 Vue 3 的区别