pandas 如何将一列多样复杂类型的数值批量apply转换

一 、 前言:

在实际数据分析时, 我们常常要对不规范的数据进行规整化,一般规整化的过程比较繁琐。 如果采用pandas 的apply 函数可以快速的批量规整。

二、 案例

例如我们有一份旅客预定房间情况: abe 预订了 1号房, tom 预订了 2、4、5号房, sam 预订了 3号房。现在我们希望知道这些旅客预订的第一个房间。

1.  从一列序列值批量取元素

假设我们拿到下面一份程序员录入的表:


其中,name 为旅客名字, rooms 为旅客预定的房间(可以有多个),rooms 的所有值 都是序列类型的。

现在我们采用apply 内嵌 lambda 函数取序列第一个元素的方法, 就可以方便地得到旅客预定的第一个房间:



2.  从一列 复杂多样数据类型 的数值批量取元素

然而, 实际当中录入数据更可能把rooms 录入单个的数据(即int 型),我们得到的初始表如下:


这个时候, 前面的方法会报错, 因为id = 0,2时, rooms 的值均不是list 类型, 执行到 lambda x:x[0] 会报错。

即便采用try except异常处理, 虽然程序可以正常运行, 但不能达到转换的效果。

但假如我们在lambda 函数中考虑了异常的情况:  就可以直接转换了。(见我的上一篇博文 python lambda 函数处理异常。)

代码如下:

def getLambda(x, exec_str, ep_str):

    val = 0
    try: 
        exec(exec_str)
    except:
        exec(ep_str)
    return val

df['1st_room'] = df['rooms'].apply(lambda x:getLambda(x, "val = x[0]", "val = x"))

我们得到的结果如下:


完美的解决了这个问题。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值