【Python教程】有了它,excel彻底沦为工具人|初识pandas模块(二)

更多教程请私信~

来源:思路实验室 

作者:室长

大家好,欢迎收看思路实验室出品的Python入门教程,我是室长。

在上一期我们初步的介绍了一下pandas模块的基础功能,把表格导入到了python中并实现了连接,把分散的数据整合到了一起。

我们把两个表整合以后出现了一些不和谐的情况:

1.两个表里都存在“姓名”这一列,整合以后不光这两列数据重复,而且还被加上了后缀来区分,非常难看。对于我们来说,专项扣除表里的名字没有任何意义,我只要找到你的工号就能知道你是谁。所以“姓名”这一列是冗余的。我们一开始就应该删掉它。在pandas中删除数据非常的优雅,只需要使用drop方法

注意这里的参数,columns是所要丢掉的列名,如果需要丢掉多列就填列名的列表。inplace是是否修改这个表格本身,默认为False。如果inplace=False,需要将方法的返回值存入变量才有意义。

这时候我们再去整合两个表,就不会出现两列数据重复的问题。

2.我们使用左连接的方式去连接两个表,而右表中有些数据是缺失的,因此整合时缺失值被填成了na。但这很不合理。没有申报专项扣除的人,专项扣除的额度应该是0。我们可以使用fillna方法将所有的na值替换为指定的值:

这下整合后的表就比较完善了。

接下来我们需要计算应纳税所得额了。大家知道年收入6万元以下的部分是无需纳税的,减去6万元后的年收入还要再减去专项扣除的部分才是应纳税所得额(当然实际情况可能会复杂一些,这里只是举一个例子,用词也可能不准确,请大家多指正。)那公式就有了:应纳税所得额 = 年收入-60000-专项扣除。我们如何算出每个人的应纳税所得额并作为新的一列存到表格中呢?非常简单也非常直观:

但是简单归简单,不能不合逻辑啊!这里张三的应纳税所得额是负值。你一年没挣够6万,国家不找你收税就完了,怎么的,还想让国家给你纳税啊?

所以应纳税所得额最低也就是0了,不能再低了。不过这也好办,我们可以使用clip方法,让这一列里小于0的值都改为0:

应纳税所得额安排明白了,就差最终需要计算的纳税额了。对于纳税额我们可以采用速算扣除数的方法进行快捷计算,但因为是阶梯税制,没办法用一个简单的公式来计算。但是我们可以写一个函数去处理这种情况。

目前的阶梯税制一共有七档,我们需要判断给定的应纳税所得额在不在这个档里,如果在,就按这个档的速算扣除数和税率进行计算。我们把速算扣除数的信息写入到表格里,并转换为DataFrame:

条件都摆在这儿了,我们可以用for循环去挨个试。

首先我们需要知道这个表格有多少行才好决定循环多少轮。这时候我们可以访问shape属性。shape属性是一个元祖,元祖的第一个元素是DataFrame的行数,第二个元素是列数,所以我们访问shape[0]就可以了。

其次,我们调用每一行的某个值时总免不了使用loc方法提取单独行,代码写起来比较麻烦,所以干脆把提取每一行的操作存到一个变量名里。

然后我们就需要做判断了,如果应纳税所得额大于这一档的起点并小于这一档的终点,那就要按这一档的速算扣除数和税率去计算。最后一档实际上并没有设置上限,但为了好看还是填了一个数。所以刚才那个一千万是我瞎编的,你写十个亿也可以。万一真有人的收入超过这个范围了也不用怕,我们在后边设置了条件,也就是循环到最后一次的时候就会归为最后一档。

最后我们来计算纳税额。公式很简单:纳税额 = 税率 * 应纳税所得额 - 速算扣除数。

写成函数,大概就是这个样子:

我们希望对每一行数据都使用一下这个函数,但使用for循环又会变得麻烦。理想的情况应该像在excel中拖动单元格右下角的小方块一样简单,这是可以的,而这个操作被称为广播操作,在DataFrame中我们可以使用apply方法去进行广播操作。

但apply方法的第一个参数坑位填的是一个函数。我们把tax函数填进去?那tax函数的参数填什么呢?

仔细看我们定义的函数,第一个参数是应纳税所得额,是一个数,现在我们怎么获得这个数呢?不知道,我也不能填result['应纳税所得额'],这是一列数据,数据类型不匹配。可我也不知道它广播到哪行了,我给不出一个确切的行数,所以也不能使用loc方法。

问题好像卡在这里了。那我们不妨开一开金手指,作一作弊,请出一个我们还没有学习过的函数——lambda函数

要去详说lambda函数的功能和用法,那可是一时半会儿也说不完。但在这个程序里,它的作用是这样的:

apply方法把表格中的一行塞给了lambda,这一行是哪行?你不知道,lambda也不管,但你可以让lambda把这行改成个你喜欢的名字,然后按照你喜欢的名字代入到你的函数里。所以在这个应用里,lambda函数解决了我们不知道该怎么调用数据的问题。

apply方法的axis参数是指广播的方向,axis=1即纵向广播(就像excel里向上下拖动单元格右下角的黑色小方块)

我们赶快来打印一下结果:

18行代码,我们就已经完成了从表格读取到整合到调整数据再到最后算出纳税额的全过程!想一想,如果使用excel去计算纳税额,需要使用多长的函数呢?

再加一把劲,我们把计算好的表格存下来。将表格存为csv也非常方便,只要使用to_csv方法,不过这里我们需要注意文件的编码问题,直接将encoding参数赋为'utf_8_sig',这样的话我们使用excel打开就可以正常的显示了:

看看代码文件夹下,是不是有相应的文件生成了?

我们用两期的时间来以个税计算的例子来向大家介绍pandas的强大功能。当然,pandas的强大还远不止于此,我们将在未来的学习中带大家逐步领略pandas的魅力。如果这篇文章对你有所帮助,希望能帮室长点个赞和在看,你的鼓励是室长进步的动力!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值