我有一个DataFrame:
A B
1: 0 1
2: 0 0
3: 1 1
4: 0 1
5: 1 0
如果来自列A 的值等于0,我想用列B 的值更新DataFrame的每个项目列A 。>
我想要获取的DataFrame:
A B
1: 1 1
2: 0 0
3: 1 1
4: 1 1
5: 1 0
我已经尝试过此代码
df['A'] = df['B'].apply(lambda x: x if df['A'] == 0 else df['A'])
它引发错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
答案 0 :(得分:2)
使用where
In [348]: df.A = np.where(df.A.eq(0), df.B, df.A)
In [349]: df
Out[349]:
A B
1: 1 1
2: 0 0
3: 1 1
4: 1 1
5: 1 0
答案 1 :(得分:0)
df['A'] = df.apply(lambda x: x['B'] if x['A']==0 else x['A'], axis=1)
输出
A B
1: 1 1
2: 0 0
3: 1 1
4: 1 1
5: 1 0
答案 2 :(得分:0)
您可以使用遮罩执行此操作:
df = pd.DataFrame()
df['A'] = [0,0,1,0,1]
df['B'] = [1,0,1,1,0]
mask = (df.A == 0)
df.loc[mask,'A'] = df.loc[mask,'B']
A B
0 1 1
1 0 0
2 1 1
3 1 1
4 1 0
编辑: 好的,这实际上是一个无效的解决方案:
%timeit df.loc[mask,'A'] = df.loc[mask,'B']
%timeit df.apply(lambda x: x['B'] if x['A']==0 else x['A'], axis=1)
%timeit np.where(df.A.eq(0), df.B, df.A)
5.52 ms ± 556 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.27 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
796 µs ± 89.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
因此,感谢您使用np.where的高效解决方案为零!