Pandas数据处置三板斧,你会几板?

在一样平常的数据处置中,经常会对一个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 0
    return gender
#注重这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)

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

字典map原理.png

函数map原理.png

不论是行使字典照样函数举行映射,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时事实发生了什么呢?历程是怎么实现的?照样通过图解的方式来一探事实。(取前五条数据为例)


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

,

联博统计

www.9cx.net采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,

那若是在现实使用中需要按行举行操作(axis=1),那整个历程又是怎么实现的呢?

在数据集中,有身高和体重的数据,以是凭据这个,我们可以盘算每个人的BMI指数(体检时常用的指标,权衡人体肥胖水平和是否康健的主要尺度),盘算公式是:体重指数BMI=体重/身高的平方(国际单位kg/㎡),由于需要对每个样本举行操作,这里使用axis=1的apply举行操作,代码如下:

def BMI(series):
    weight = series["weight"]
    height = series["height"]/100
    BMI = weight/height**2
    return BMI

data["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)

数据处置三板斧就先容到这里,有问题迎接下方留言板努力留言呀!

猜您喜欢
往期精选▼

  1. 一文带你掌握常见的Pandas性能优化方式,让你的pandas飞起来!
  2. 鬼话NBA | 用数据带你回首乔丹的职业生涯
  3. 互联网隆冬下,数据分析师还吃香吗?

关注我们


1529321439513643.jpg
民众号ID:Python读财
一个纪录发展的民众号
原创不易,以为不错就点个 ”在看“ 吧,拜谢列位老铁。