作者 | 易执

责编 | Elle

在日常的数据处理中,经常会对一个DataFrame进行逐行、逐列和逐元素的操作,对应这些操作,Pandas中的map、apply和applymap可以解决绝大部分这样的数据处理需求。这篇文章就以案例附带图解的方式,为大家详细介绍一下这三个方法的实现原理,相信读完本文后,不论是小白还是Pandas的进阶学习者,都会对这三个方法有更深入的理解。

本文演示的数据集是模拟生成的,想练手的可以按下方的代码生成。

boolean=[True,False]
gender=["男","女"]
color=["white","black","yellow"]
data=pd.DataFrame({"height":np.random.randint(150,190,100),"weight":np.random.randint(40,90,100),"smoker":[boolean[x] for x in np.random.randint(0,2,100)],"gender":[gender[x] for x in np.random.randint(0,2,100)],"age":np.random.randint(15,90,100),"color":[color[x] for x in np.random.randint(0,len(color),100) ]
}
)

数据集如下所示,各列分别代表身高、体重、是否吸烟、性别、年龄和肤色。

Series数据处理

map

如果需要把数据集中gender列的男替换为1,女替换为0,怎么做呢?绝对不是用for循环实现!!!使用Series.map()可以很容易做到,最少仅需一行代码。

#①使用字典进行映射
data["gender"] = data["gender"].map({"男":1, "女":0})#②使用函数
def gender_map(x):gender = 1 if x == "男" else 0return gender
#注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)

那map在实际过程中是怎么运行的呢?请看下面的图解(为了方便展示,仅截取了前10条数据)

不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。

apply

同时Series对象还有apply方法,apply方法的作用原理和map方法类似,区别在于apply能够传入功能更为复杂的函数。怎么理解呢?一起看看下面的例子。

假设在数据统计的过程中,年龄age列有较大误差,需要对其进行调整(加上或减去一个值),由于这个加上或减去的值未知,故在定义函数时,需要加多一个参数bias,此时用map方法是操作不了的(传入map的函数只能接收一个参数),apply方法则可以解决这个问题。

def apply_age(x,bias):return x+bias#以元组的方式传入额外的参数
data["age"] = data["age"].apply(apply_age,args=(-3,))

可以看到age列都减了3,当然,这里只是简单举了个例子,当需要进行复杂处理时,更能体现apply的作用。

总而言之,对于Series而言,map可以解决绝大多数的数据处理需求,但如果需要使用较为复杂的函数,则需要用到apply方法。

DataFrame数据处理

apply

对DataFrame而言,apply是非常重要的数据处理方法,它可以接收各种各样的函数(Python内置的或自定义的),处理方式很灵活,下面通过几个例子来看看apply的具体使用及其原理。

在进行具体介绍之前,首先需要介绍一下DataFrame中axis的概念,在DataFrame对象的大多数方法中,都会有axis这个参数,它控制了你指定的操作是沿着0轴还是1轴进行。axis=0代表操作对列columns进行,axis=1代表操作对行row进行,如下图所示。

如果还不是很了解,没关系,下面会分别对apply沿着0轴以及1轴的操作进行讲解,继续往下走。

假设现在需要对data中的数值列分别进行取对数和求和的操作,这时可以用apply进行相应的操作,因为是对列进行操作,所以需要指定axis=0,使用下面的两行代码可以很轻松地解决我们的问题。

# 沿着0轴求和
data[["height","weight","age"]].apply(np.sum, axis=0)# 沿着0轴取对数
data[["height","weight","age"]].apply(np.log, axis=0)

实现的方式很简单,但调用apply时究竟发生了什么呢?过程是怎么实现的?还是通过图解的方式来一探究竟。(取前五条数据为例)

当沿着轴0(axis=0)进行操作时,会将各列(columns)默认以Series的形式作为参数,传入到你指定的操作函数中,操作后合并并返回相应的结果。

那如果在实际使用中需要按行进行操作(axis=1),那整个过程又是怎么实现的呢?

在数据集中,有身高和体重的数据,所以根据这个,我们可以计算每个人的BMI指数(体检时常用的指标,衡量人体肥胖程度和是否健康的重要标准),计算公式是:体重指数BMI=体重/身高的平方(国际单位kg/㎡),因为需要对每个样本进行操作,这里使用axis=1的apply进行操作,代码如下:

def BMI(series):weight = series["weight"]height = series["height"]/100BMI = weight/height**2return BMIdata["BMI"] = data.apply(BMI,axis=1)

还是用图解的方式来看看这个过程到底是怎么实现的(以前5条数据为例)。

当apply设置了axis=1对行进行操作时,会默认将每一行数据以Series的形式(Series的索引为列名)传入指定函数,返回相应的结果。

总结一下对DataFrame的apply操作:

  1. 当axis=0时,对每列columns执行指定函数;当axis=1时,对每行row执行指定函数。

  2. 无论axis=0还是axis=1,其传入指定函数的默认形式均为Series,可以通过设置raw=True传入numpy数组。

  3. 对每个Series执行结果后,会将结果整合在一起返回(若想有返回值,定义函数时需要return相应的值)。

  4. 当然,DataFrame的apply和Series的apply一样,也能接收更复杂的函数,如传入参数等,实现原理是一样的,具体用法详见官方文档。

applymap

applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作,虽然用途不如apply广泛,但在某些场合下还是比较有用的,如下面这个例子。

为了演示的方便,新生成一个DataFrame

df = pd.DataFrame({"A":np.random.randn(5),"B":np.random.randn(5),"C":np.random.randn(5),"D":np.random.randn(5),"E":np.random.randn(5),}
)
df

现在想将DataFrame中所有的值保留两位小数显示,使用applymap可以很快达到你想要的目的,代码和图解如下:

df.applymap(lambda x:"%.2f" % x)

本文为Python读财投稿。

热 文 推 荐 

☞我国自主开发的编程语言“木兰”是又一个披着“洋”皮的红芯浏览器吗?

☞台积电否认受美国施压去建厂;微信公众号文章可发放定制红包封面;Git v2.25.0 发布 | 极客头条

☞2020 开春程序员面试必备!拿走不谢!

滴滴章文嵩:一个人的20年开源热情和国内互联网开源运动

☞别让腾讯“科技向善”太孤独!

☞集五福,我用Python

☞搜狐员工迟到一次罚 500 元,张朝阳回应“资本家就得剥削员工”

☞如何打通“鱼塘” ?腾讯启动“SaaS技术联盟” 共建技术中台

你点的每个“在看”,我都认真当成了喜欢

Pandas 数据处理三板斧,你会几板?相关推荐

  1. 12 个 Pandas 数据处理高频操作

    作者 | 老表 来源 | 简说Python 今天给大家分享几个自己近期常用的Pandas数据处理技巧,主打实用,所以你肯定能用的着,建议扫一遍,然后收藏起来,下次要用的时候再查查看即可. 简单说说 总 ...

  2. c++ map用法_Pandas数据处理三板斧——map、apply、applymap详解

    在日常的数据处理中,经常会对一个DataFrame进行逐行.逐列和逐元素的操作,对应这些操作,Pandas中的map.apply和applymap可以解决绝大部分这样的数据处理需求.这篇文章就以案例附 ...

  3. pandas数据处理 代码_使用Pandas方法链接提高代码可读性

    pandas数据处理 代码 We have been talking about using the Pandas pipe function to improve code readability. ...

  4. ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用

    ARM Linux摄像头传感器数据处理全景视野:从板端编码视频到高级应用 1. 摄像头传感器与数据采集(Camera Sensor and Data Acquisition) 1.1 数字摄像头传感器 ...

  5. Pandas数据处理1、DataFrame删除NaN空值(dropna各种属性值控制超全)

    Pandas数据处理--渐进式学习 目录 Pandas数据处理--渐进式学习 前言 环境 DataFrame删除NaN空值 dropna函数参数 测试数据 删除所有有空的行 axis属性值 how属性 ...

  6. Pandas数据处理4、DataFrame记录重复值出现的次数(是总数不是每个值的数量)

    Pandas数据处理4.DataFrame记录重复值出现的次数(是总数不是每个值的数量) 目录 Pandas数据处理4.DataFrame记录重复值出现的次数(是总数不是每个值的数量) 前言 环境 基 ...

  7. Pandas数据处理2、DataFrame的drop函数具体参数使用详情

    Pandas数据处理2.DataFrame的drop函数具体参数使用详情 目录 Pandas数据处理2.DataFrame的drop函数具体参数使用详情 前言 环境 基础函数的使用 drop函数 编码 ...

  8. pandas数据处理120题

    1.DataFrame基本操作 import numpy as np import pandas as pd import matplotlib.pyplot as plt 1.将下面的字典创建为Da ...

  9. 轩小陌的Python笔记-Pandas 数据处理

    Pandas 数据处理 一.数据IO操作 pandas IO操作主要是读取和写入有特定格式的文件,如CSV文件.TXT文件: # 本质上pd.read_csv和pd.read_tablepd.read ...

最新文章

  1. 互补性:从不同的角度思考同一个事物时,发现它同时具有不同甚至相互矛盾的性质...
  2. 使用docker安装mysql服务
  3. l298n电机哪一端为正_一文详解电机倒顺开关接法!
  4. HBase存储相关概念
  5. linux终端怎么设置monaco,Monaco Editor 使用指南
  6. C++_数据类型_布尔类型_以及数据的输入_以及算术运算符_加减乘除运算---C++语言工作笔记013
  7. 091 类的多态和多态性
  8. python 爬虫生成csv文件和图_Python简单爬虫导出CSV文件的实例讲解
  9. 风袖第一阶段小程序wx.request封装
  10. 华硕ROG|玩家国度 魔霸7Plus G713PV win11原厂系统 带ASUS Recovery
  11. Unity TouchScripts实例 - 判断在物体上滑动
  12. [DNS 设置] 电脑无法访问网页,但可以正常使用QQ和微信。
  13. iOS 九年,技术迭代迅捷下如何保持核心竞争力?
  14. C#生成随机数100次都是一样的数
  15. Xshell7如何查看登录密码
  16. Workflow设计模式指的什么?
  17. Flutter自定义 TabBar
  18. 山西计算机教室配备标准,山西省普通高中的教育技术装备建设标准试行.doc
  19. GMap.NET入门详细教程【1】--------下载 GMap.NET,并在VS中添加GMap.NET控件
  20. opcv 直方图计算

热门文章

  1. 西安Uber优步司机奖励政策(12月14日到12月20日)
  2. LeetCode 229 : Majority Element II
  3. 字典树 之 hdu 1247
  4. javascript中的一些核心知识点以及需要注意的地方
  5. Reflector.exe + ilDasm.exe + ilasm.exe 破解DundasWebChart(VS2005) 5.5 成功
  6. WEB打印分页类(JS)
  7. python 读取邮件内容_利用Python imaplib和email模块 读取邮件文本内容及附件内容...
  8. leetcode python3 简单题1.Two Sum
  9. 自带公式编辑_公式都是怎么编辑出来的?如何打出公式上下标符号?
  10. 《推荐系统笔记(七)》因子分解机(FM)和它的推广(FFM、DeepFM)