Вы можете использовать numpy.where
(который я бы предпочел назвать numpy.if_then_else
).
>>> df['row3'] = np.where(df['row2'] == -1, df['row1'], df['row2'])
>>> df
row1 row2 row3
0 0 500 500
1 1400 -1 1400
2 1330 -1 1330
3 0 900 900
4 500 -1 500
В качестве альтернативы, немного более краткий, но очень контекст, специфичный для настройкина ваш вопрос:
>>> df['row3'] = np.where(df['row1'], df['row1'], df['row2'])
>>> df
row1 row2 row3
0 0 500 500
1 1400 -1 1400
2 1330 -1 1330
3 0 900 900
4 500 -1 500
Сроки:
>>> df = pd.concat([df]*1000)
>>> df_c = df.copy()
>>> %timeit df.clip_lower(0).sum(1) # coldspeed 1
537 µs ± 5.17 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df.row2.mask(df.row2.eq(-1)).combine_first(df.row1) # coldspeed 2
964 µs ± 15.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df_c.loc[df_c.row2 == -1, 'row2'] = np.nan; df_c.row2.add(df_c.row1, fill_value=0) # coldspeed 3
2.66 ms ± 24.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit [r1 if r2 == -1 else r2 for r1, r2 in zip(df.row1, df.row2)] # Daniel Mesejo
466 µs ± 1.79 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit df.replace(-1,0).sum(1) # W-B
783 µs ± 45.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit np.where(df['row2'] == -1, df['row1'], df['row2']) # timgeb 1
173 µs ± 4.29 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit np.where(df['row1'], df['row1'], df['row2']) # timgeb 2
38.1 µs ± 3.69 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)