apply是pandas一个强大的工具函数,可以逐行对数据进行操作。pandas的优点很多,比如代码简洁、相对直接遍历效率更高;但它的“效率高”是相对的,相对于merge之类的操作,apply的执行时间可能会高出两个数量级。比如下面这行:
1 2 | #为订单数据集增加以后一列:微信支付的金额 df['pay_wx'] = df.apply(lambda x: (x.pay if x.chan == 'wx' else 0), axis=1) |
从上面的代码看,逻辑非常简洁,但是实际测试,50万的数据量,要20秒。下面尝试改造一下
1 2 3 4 | df_wx = df[df['chan'] == 'wx'] df_wx.rename(columns={'pay': 'pay_wx'}, inplace=True) df['pay_wx'] = df_wx['pay_wx'] df.fillna({'pay_wx': 0}, inplace=True) |
代码从一行变成了四行,不过执行效率可以高很多:50万数据,时间大约0.7秒
当然,方法不止一种,对于更见的判断条件,可以直接用merge操作:
1 2 3 4 5 6 7 8 9 10 | #合并某项分类依据 df['color'] = df.apply(lambda x: ('红' if x.color == '粉红' else x.color), axis=1) #使用merge优化 df_h = df[df['color'] == '粉红'][['id', 'color']] df_h['color'] = '红' df_nh = df[df['color'] != '粉红'][['id', 'color']] df_hs = pd.concat([df_h, df_nh]) df_hs.rename(columns={'color':'color2'}, inplace=True) df = pd.merge(df, df_h, on='id', how='left') df['color'] = df['color2'] |
通过上面这种方法改造,执行时间和第一个方法接近,50万条数据大约0.8秒
———–
转载请注明出处:http://www.jiangkl.com/2022/12/no_apply