21、pandas的apply()和applymap()函数(还有pd.to_*的用法)

是否大量使用自定义函数是区分编程小白和老手的重要指标。

虽然在处理数据时,使用自定义函数能够大大缩减时间,并且达到一些别的方法没法完成的效果。在熟练的数据分析员代码里,大部分的篇幅都是在定义函数,而最后的应用只占很小的篇幅。

apply()是对DataFrame里的每行或列进行函数应用。

applymap()是对DataFrame里的每个元素进行函数的应用。

map()是对Series里(就是单独的一列)的每个元素进行函数应用。

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第1张图片
数据源

把price和total_price两列改成两位小数的浮点数:

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第2张图片
保留两位小数

需要注意的是使用lambda保留两位小数之后的数据是object类型的,而不是浮点型,需要经过转换之后才能变成浮点型。

其它列都不是数值,不能使用保留两位小数的函数,所以只能对这两列进行使用。

如果只对一列进行处理需要使用map(),用其它的函数会报错

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第3张图片
df3也是object格式

还可以把修改后的结果赋值到源数据:

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第4张图片
把修改后的结果赋值到源数据

lambda在这里其实是在定义一个简单的函数,一个没有函数名的函数。

还可以先对某一列进行操作之后在进行保留两位小数:

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第5张图片
先进行运行在保留两位小数

以上的操作之后数据类型都变成object,而不是浮点数或者整数类型,因此我们需要将其转换成浮点数或者整数(使用.convert_objects(convert_numeric=True)来进行转换):

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第6张图片
转换成浮点型

然后就可以使用运算符进行计算了:

使用运算符进行计算

不过使用.convert_objects(convert_numeric=True)转换后进行计算不是Python推荐的使用方法,Python推荐使用的是pd.to_numeric的方法:

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第7张图片
pd.to_numeric的方法转换数据类型
21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第8张图片
pd.to_numeric的方法转换数据类型

对转换后的数据进行计算:

对转换后的数据进行计算

不过这个方式一次只能改一个列,而不是选择多列统一进行更改。

那么如果我们要在把每一列的数值都进行计算,然后在最底下加上一行总计要怎么操作呢?

这个使用就不能使用lambda函数了,而是需要进行自定义函数(当然也可以使用前面说过的方法),先定义一个求和的函数:

21、pandas的apply()和applymap()函数(还有pd.to_*的用法)_第9张图片
使用自定义函数进行计算

如果是想要对行进行计算的话只需要添加参数axis=1就可以了。

还有一点需要注意的是:pandas自带的函数不要用apply(),map()等这些函数,只需要直接一个点‘.’就可以了。

你可能感兴趣的:(21、pandas的apply()和applymap()函数(还有pd.to_*的用法))