Pandas进阶:transform 数据转换的常用技巧

news2025/1/13 13:11:59

引言

本次给大家介绍一个功能超强的数据处理函数transform,相信很多朋友也用过,这里再次进行详细分享下。

transform有4个比较常用的功能,总结如下:

  • 转换数值

  • 合并分组结果

  • 过滤数据

  • 结合分组处理缺失值

一. 转换数值

pd.transform(func, axis=0)

以上就是transform转换数值的基本用法,参数含义如下:

  • func是指定用于处理数据的函数,它可以是普通函数字符串函数名称函数列表轴标签映射函数的字典

  • axis是指要应用到哪个轴,0代表列,1代表行。

1. 普通函数

func可以是我们正常使用的普通函数,像下面例子这样自定义一个函数。

df = pd.DataFrame({'A': [1,2,3], 'B': [10,20,30] })
def plus_10(x):
    return x+10
df.transform(plus_10)

图片

或者,也可以用lambda函数简洁的实现,效果是一样的。

df.transform(lambda x: x+10)

2. 字符串函数

也可以传递任何有效的pandas内置的字符串函数,例如sqrt

df.transform('sqrt')

图片

3. 函数列表

func还可以是一个函数的列表。例如numpysqrtexp函数的列表组合:

df.transform([np.sqrt, np.exp])

图片

通过上面结果看到,两个函数分别作用于AB每个列。

4. 轴标签映射函数的字典

如果我们只想将指定函数作用于某一列,该如何操作?

func还可以是轴标签映射指定函数的字典。例如:

df.transform({
    'A': np.sqrt,
    'B': np.exp,
})

图片

这样,就可以对ABL两列分别使用相应函数了,互补干扰。

二、合并分组结果

这个功能是东哥最喜欢的,有点类似SQL的窗口函数,就是可以合并grouby()的分组结果。用一个例子说明:

df = pd.DataFrame({
  'restaurant_id': [101,102,103,104,105,106,107],
  'address': ['A','B','C','D', 'E', 'F', 'G'],
  'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'],
  'sales': [10,500,48,12,21,22,14]
})

图片

我们可以看到,每个城市都有多家销售餐厅。我们现在想知道每家餐厅在城市中所占的销售百分比是多少。 预期输出为:

图片

传统方法是:先groupby分组,结合apply计算分组求和,再用merge合并原表,然后再apply计算百分比。

但其实用transform可以直接代替前面两个步骤(分组求和、合并),简单明了。

首先,用transform结合groupby按城市分组计算销售总和。

df['city_total_sales'] = df.groupby('city')['sales']
                           .transform('sum')

图片

可以看到,使用transfrom计算分组的求和并不会像apply一样改变原表的结构,而是直接在原表的基础上再增加一列。

这样就可以一步到位,得到我们想要的格式。

然后,再计算百分比调整格式,搞定。

df['pct'] = df['sales'] / df['city_total_sales']
df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))

图片

三、过滤数据

transform也可以用来过滤数据。仍用上个例子,我们希望获得城市总销售额超过40的记录,那么就可以这样使用。

df[df.groupby('city')['sales'].transform('sum') > 40]

图片

上面结果来看,并没有生成新的列,而是通过汇总计算求和直接对原表进行了筛选,非常优雅。

四、结合分组处理缺失值

df = pd.DataFrame({
    'name': ['A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'value': [1, np.nan, np.nan, 2, 8, 2, np.nan, 3]
})

在上面的示例中,数据可以按name分为三组A、B、C,每组都有缺失值。我们知道替换缺失值的常见的方法是用mean替换NaN。下面是每个组中的平均值。

df.groupby('name')['value'].mean()
name
A    1.0
B    5.0
C    2.5
Name: value, dtype: float64

我们可以通过transform()使用每组平均值来替换缺失值。用法如下:

df['value'] = df.groupby('name')
                .transform(lambda x: x.fillna(x.mean()))

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1274410.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

观海微电子---AF、AG、AR 的差别和作用

一、名称解释及原理 1.AF ---- Anti-fingerprint,中文为抗指纹。一般 SiO2AF 材料(DON,M4、道康宁 AF 材料),一般采用真空蒸发镀膜法。 原理:AF 防污防指纹玻璃是根据荷叶原理,在玻璃外表面涂制…

⭐ Unity + ARKIT ARFace脸部追踪

相比之前的图像物体检测,这脸部检测实现起来会更加的简单。 (1)首先我们先在场景中的物体上添加一个AR Face Mananger组件: (2)以上組件的 Face Prefab所代表的就是脸部的模型也就是覆盖在脸部上面的投影模…

单片机怎么实现真正的多线程?

单片机怎么实现真正的多线程? 不考虑多核情况时,CPU在一个时间点只能做一件事,因为切换的速度快所以看起来好像是同时执行多个线程而已。 实际上就是用定时器来做时基,以时间片的方式分别执行来实现的,只不过实现起来细节比较复…

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…

Django 用户验证与权限管理详解

概要 Django是一款强大且灵活的Python Web框架,不仅在构建功能复杂的网站应用中表现出色,还在诸如用户验证、权限管理等细微之处提供了优秀的解决方案。在多用户、权限复杂的Web应用中,认证和权限管理尤其重要。接下来,我们就来探…

五、Linux基础软件安装

目录 1、安装JDK 2、安装Mysql 接下来,我们来学习如何在linux上安装JDK和Mysql,安装之前需要在Linux上提前创建三个目录: mkdir -p /export/software #软件包存放目录 mkdir -p /export/server #安装目录 mkdir -p /export/data #数据存放目录…

【Windows】解决Windows11错误0x80190001

1. 安装Fiddler网络调试工具 下载链接:Fiddler Classic 注:获取安装包的过程中可能要获取邮箱信息,但不用验证邮箱,大概是给你的邮箱发广告信息,问题不大。 在“开始”界面找到Fiddler Classic,点击运行…

封装flutter webview页面

例如在flutter里面跳转百度页面 需要安装webview_flutter webview_page.dart import package:flutter/material.dart; import package:webview_flutter/webview_flutter.dart;class MyWebView extends StatefulWidget {const MyWebView({super.key, required this.webViewUrl,…

入门Python+Vue 全栈开发可视化BI数据项目几个要点总结

随着数据的快速增长和业务的复杂性,越来越多的企业开始关注数据分析和可视化。在本文中,我们将介绍如何使用Python和Vue进行全栈开发,构建一个可视化BI数据项目,并总结几个关键要点。 首先,Python是一种强大而灵活的编…

【JAVA面向对象编程】--- 探索子类如何继承父类

🌈个人主页: Aileen_0v0🔥学习专栏: Java学习系列专栏 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 继承 继承的普通成员方法调用 及 普通成员变量修改 构造方法的调用 子类构造方法 继承 package Inherit;class Animal …

企业软件的分类|app小程序网站定制开发

企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件,它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同,可以将企业软件分为以下几类。 1. 企业资源计划(ERP&#xff09…

rest_framework_django 学习笔记二(视图路由)

rest_framework_django 学习笔记二(视图路由) rest_framwork_django学习笔记一(序列化器) 一、rest framework 中Request 与 Response 1、Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,二是REST Fame…

git解决冲突

记录一次 git 解决冲突的过程。 情况是前一段时间我基于本地的 master 分支上新建了一个分支比如叫做 weight_linear: git checkout -b weight_linear 然后我已经在这个分支上进行了修改并上传到 github 上了,比如: git add . git commit -m "u…

uc_09_创建新进程 exec() system()

1 什么是创建新进程(夺舍) 在前面文章中,我们学习了fork()函数用来创建子进程。 子进程是父进程的副本,复制父进程除代码段以外的其他数据,代码段数据和父进程共享。 子进程的PID与父进程不同: 而创建新进程则不同。 与fork()不同…

传统算法: Pygame 实现深度优先搜索(DFS)

使用 Pygame 模块实现了深度优先搜索(DFS)的动画演示。首先,它通过邻接矩阵表示了一个图的结构,其中每个节点表示一个字符,每个字符的邻居表示与之相邻的节点。然后,通过深度优先搜索算法递归地访问所有节点,过程中通过动画效果可视化每一步的变化。每次访问一个节点,该…

数据爬虫(JSON格式)数据地图可视化(pyecharts)【步骤清晰,一看就懂】

一、前言 数据存储在网页上,需要爬取数据下来,数据存储格式是JSON,数据可视化在工作中也变得日益重要,接下来将数据爬虫与数据可视化结合起来,做个案例 注:当时数据是22年1月29日爬取数据 二、使用步骤 …

嵌入式数据传输及存储的C语言实现

各种类型的数据传输和存储就涉及到大小端的问题,首先要简单说下芯片的大小端问题,这里主要讨论Cortex-M内核。 M内核支持大端或者小端,实际应用中大部分内核都是小端。以STM32为例,全部都是小端,而且是芯片设计之初就固…

TR转发路由器测评—云企业网实现跨地域跨VPC的网络互通测评实战【阿里云产品测评】

文章目录 一.转发路由器 Transit Router 测评1.1 准备阶段1.2 本文测评收获1.3 什么是云企业网实例、转发路由器实例和云数据传输服务 二.使用云企业网实现跨地域跨VPC的网络互通2.2 **测试连通性**2.3 网络拓扑如下: 心得:总结: 声明&#x…

Vue+SpringBoot解决session跨域问题

做了一个前后端分离,因为前后端的 session id不一致,导致前端请求时,后端的session读取不到对应的值,造成登录问题。 解决方法: SpringBoot项目: 添加一个跨域配置 代码如下: 或者controller使用CrossOrigin Conf…

解决noauth authentication required异常

今天在使用redis数据库的时候,突然给报了个这个错误,上网一查才知道是因为 Redis 服务器需要密码进行身份验证,因此,我们需要通过auth password 进行身份验证。不过我这个密码还是试了很多次才想起来的,哦好像是听网课…