首页 > 解决方案 > pandas 获得 np.where 的一列或另一列替代

问题描述

想象一下我有一个这样的数据框

exDF=pd.DataFrame({'choice':['left','right','left','left','right'],'LeftDoor':['l1','l2','l3','l4','l5'],'RightDoor':['r1','r2','r3','r4','r5']})


    choice  LeftDoor RightDoor
   0    left    l1   r1
   1    right   l2   r2
   2    left    l3   r3
   3    left    l4   r4
   4    right   l5   r5

我想尽可能有效地获得做出的选择,例如来自 LeftDoor 或 RightDoor 的值。

例如,我试过

chosen=np.where(exDF['choice']=='left',exDF['LeftDoor'],exDF['RightDoor'])
not_chosen=np.where(exDF['choice']=='left',exDF['RightDoor'],exDF['LefttDoor'])

但这似乎非常低效,实际上需要很长时间才能使用大数据框

另一种选择可能是

chosenLeft=exDF['choice']=='left'
chosenRight=exDF['choice']=='Right'

但是然后我如何将这两者组合成一个列出“选择”的列。不同的索引不符合pd.concat()

基本上我想用 2 列出来

chosen:[l1,r2,l3,l4,r5]
not_chosen:[r1,L2,r3,r4,l5]

我可能过于复杂了,谢谢你的帮助。

标签: pandas

解决方案


我认为np.where这里最快:

#500k rows
exDF = pd.concat([exDF] * 100000, ignore_index=True)

In [55]: %%timeit
    ...: m = exDF['choice']=='left'
    ...: chosen=np.where(m,exDF['LeftDoor'],exDF['RightDoor'])
    ...: not_chosen=np.where(m,exDF['RightDoor'],exDF['LeftDoor'])
    ...: 
32.4 ms ± 216 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [56]: %%timeit
    ...: m = exDF['choice']=='left'
    ...: chosen=exDF['LeftDoor'].where(m,exDF['RightDoor'])
    ...: not_chosen=exDF['RightDoor'].where(m,exDF['LeftDoor'])
    ...: 
55.8 ms ± 223 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

推荐阅读