3个Pandas的宝藏函数
大家好,我是Peter呀~
在利用Pandas进行数据处理的时候,我们经常需要对某行或者某列的数据、甚至是全部的元素执行某个相同的操作。
Pandas中的map
、apply
和applymap
就可以解决绝大部分这样的数据处理需求,让你不再重复操作。本文结合具体的例子来讲解如何使用这3个宝藏函数。
![](https://img.haomeiwen.com/i5142014/d4490db904259200.jpg)
Pandas连载文章
目前已经连载了17篇文章,其中1-16篇属于《深入浅出Pandas数据分析》的第一版,从第17篇的透视表和交叉表开始,属于进阶内容。
![](https://img.haomeiwen.com/i5142014/ee5540303b8a9e3e.jpg)
模拟数据
下面是一份主要模拟的数据,几位同学的个人信息(数据仅供学习)
![](https://img.haomeiwen.com/i5142014/6bb2d89dc5b0aaf4.jpg)
import numpy as np
import pandas as pd
data = pd.DataFrame({"name":["小明","小红","小张","小周","小孙","小王"],
"sex":["男","女","女","男","男","男"],
"birthday":["2003-07-07","1993-08-09","1999-03-05","1995-08-19","2002-11-18","1996-07-01"],
"address":["深圳南山区","广州越秀区","浙江杭州","上海","北京海淀","湖北省武汉市武昌"],
"age":[18,28,22,26,19,25],
"height":[189,178,167,172,182,185],
"weight":[89,72,62,68,79,81]
})
data
![](https://img.haomeiwen.com/i5142014/78de48157ff9f9bd.jpg)
我们看下数据类型:前面4个都是字符类型,后面的3个数值型
![](https://img.haomeiwen.com/i5142014/07c8870b13fafba9.jpg)
map
假设我们现在有个这样的需求:因为有时候处理数据的时候必须使用数值型数据,将上面数据的性别这栏中的男替换成1,女替换成0。
该如何实现呢?
方法1:循环
如果你不想搞得那么复杂:通过循环判断性别的男女,然后直接赋值来实现。
每次操作之前,我们先生成一个模拟数据的副本,不破坏原始数据
![](https://img.haomeiwen.com/i5142014/4c209e3d02780881.jpg)
写个循环进行赋值:
![](https://img.haomeiwen.com/i5142014/556e3a247e1463f5.jpg)
方法2:map实现
循环的方法就是比较容易理解,写起来更方便;但是当我们的数据量过大的时候,循环就会太慢啦。使用map如何实现?
还是先生成一个副本:
![](https://img.haomeiwen.com/i5142014/def7cc9b27d1babc.jpg)
1、通过字典的映射关系
![](https://img.haomeiwen.com/i5142014/dd273a82c4429fd1.jpg)
2、写个函数传给map
![](https://img.haomeiwen.com/i5142014/f1c6324eaddc5bc5.jpg)
map使用小结:使用字典或者函数传递给map方法,它都会对传入的数据逐个当做参数传入到字典或者函数中,然后得到映射的值
apply
apply方法在使用的时候和map是比较类似的,只不过apply更全、更强大,它能够传入更为复杂的函数,通过例子来讲解下。
参数
DataFrame.apply(
func, # 待执行的函数
axis=0, # 沿着哪个轴操作,默认是0-index,1-column
raw=False, # 是否转成numpy的ndarray数组进行操作,默认是false
result_type=None, # expand’, ‘reduce’, ‘broadcast’, None # 当axis=1执行,对列属性名进行操作
args=(), # 两个可选参数
**kwargs)
进行操作之前还是先生成一个副本data3:
![](https://img.haomeiwen.com/i5142014/c9d960a06d30602b.jpg)
传入不同函数
在apply方法中我们可以传入各种不同的函数:
- 自定义函数
- python匿名函数
- python自带函数
- pandas自带函数
1、自定义函数
我们传入自定义函数:上面的改变性别表示方法的函数
![](https://img.haomeiwen.com/i5142014/28f25becf5b37356.jpg)
假设上面的年龄age都是实岁,我们想看每个人的虚岁,也就是给年龄加上1(age+1),该如何处理?
![](https://img.haomeiwen.com/i5142014/69f1c612e7db27ac.jpg)
2、python的匿名函数:lambda
![](https://img.haomeiwen.com/i5142014/23a18c75bb574c3f.jpg)
3、python自带函数
我们传入的是python自带的len函数,求解每个字符串的长度:
![](https://img.haomeiwen.com/i5142014/c68d55c87234445c.jpg)
4、pandas自带函数
我们模拟数据的时候,字段birthday是字符类型,现在我们使用pandas中自带的函数转成时间相关的数据类型:
转化前
![](https://img.haomeiwen.com/i5142014/f84e3d071c69df01.jpg)
转化后
![](https://img.haomeiwen.com/i5142014/c29aa2c459be01e5.jpg)
指定轴
可以指定axis参数,表示根据哪个轴进行操作,默认是axis=0,列方向上
为了说明这个参数,我们在模拟一个简单的数据:
![](https://img.haomeiwen.com/i5142014/d57ee70fdcdf5d59.jpg)
从默认情况、axis=0、axis=1进行对比:
![](https://img.haomeiwen.com/i5142014/668b7880f34b01c4.jpg)
看看过Excel中的效果:
![](https://img.haomeiwen.com/i5142014/097917d8f9c29f5d.jpg)
![](https://img.haomeiwen.com/i5142014/baa6d6434050ebc7.jpg)
result_type
主要是对新生成的DataFrame的列名进行操作,且只能在axis=1上进行操作,3种取值情况:
- expand
- broadcast
- reduce
1、使用result_type="expand"
![](https://img.haomeiwen.com/i5142014/6622b91f06fd7c23.jpg)
2、使用result_type="broadcast"
列名保持不变化
![](https://img.haomeiwen.com/i5142014/20653c4b159469f1.jpg)
3、使用result_type="reduce"
最终生成的是一个Series类型的数据
![](https://img.haomeiwen.com/i5142014/4d5d3654bf6a9d7e.jpg)
applymap
applymap的使用具有一定的限制性,它是针对DataFrame的每个数据执行相同的操作。
DataFrame.applymap(func, na_action=None, **kwargs)
为了说明,模拟一份简单的数据:
![](https://img.haomeiwen.com/i5142014/4eccac0b0c46c503.jpg)
可以看到,上面的数据都是一个类型float64。
每个数据加1
![](https://img.haomeiwen.com/i5142014/b1cb6df2550a9988.jpg)
每个数据保留3位小数
格式化输出数据:每个数据保留3位小数
![](https://img.haomeiwen.com/i5142014/1721b00b965e5b97.jpg)
改变数据类型
上面的模拟数据df的数据类型是float64,现在将它们统一转成str类型:
![](https://img.haomeiwen.com/i5142014/b2313d8da5e0f795.jpg)
缺失值处理
如果数据中存在缺失值,使用na_action参数来处理:
![](https://img.haomeiwen.com/i5142014/3b240e176f6378f2.jpg)
总结
对数据的行、列进行同一个操作十分常见,本文结合各种例子进行了讲解:
- map:能够满足绝大部分Series类型数据的同一个操作
- apply:map的功能都能够实现,比较灵活,能够传入各种复杂或者自带的函数进行数据处理
- applymap:对DataFrame中的数据执行同一个操作,使用较少
网友评论