我的数据框看起来如下
col1 col2 col3
0 a d 0
1 b e 1
2 c f 0
3 x t 1
.................
我想将值为1的col3更改为col2中的对应值
结果将是
col1 col2 col3
0 a d 0
1 b e e
2 c f 0
3 x t t
.................
df[['col1','col2','col3']].applymap(lambda x: df['col2'] if x==1 else x)
上面给出了错误
任何人都知道如何用熊猫做到这一点?
答案 0 :(得分:3)
使用:
df.loc[df.col3 == 1, 'col3'] = df.col2
或者:
df.col3 = df.col3.mask(df.col3 == 1, df.col2)
#df.col3 = df.col3.where(df.col3 != 1, df.col2)
#df.col3 = np.where(df.col3 == 1, df.col2, df.col3)
print (df)
col1 col2 col3
0 a d 0
1 b e e
2 c f 0
3 x t t
编辑:
使用apply + lambda
缓慢解决方案:
df = df.apply(lambda x: x['col2'] if x['col3']==1 else x, axis=1)
<强>计时强>:
#[40000 rows x 3 columns]
df = pd.concat([df] * 10000, ignore_index=True)
In [42]: %timeit df.col3 = np.where(df.col3 == 1, df.col2, df.col3)
100 loops, best of 3: 3.97 ms per loop
In [43]: %timeit df.loc[df.col3 == 1, 'col3'] = df.col2
100 loops, best of 3: 6.81 ms per loop
In [44]: %timeit df.col3 = df.col3.mask(df.col3 == 1, df.col2)
100 loops, best of 3: 4.95 ms per loop
In [45]: %timeit df.col3 = df.col3.where(df.col3 != 1, df.col2)
100 loops, best of 3: 4.8 ms per loop
In [47]: %timeit df.apply(lambda x: x['col2'] if x['col3']==1 else x, axis=1)
1 loop, best of 3: 3.39 s per loop