import pandas as pd
import numpy as np
df = pd.DataFrame({'value': np.arange(-5,5)})
df['value'] = df['value'].clip(0, None)
print(df)
дает
value
0 0
1 0
2 0
3 0
4 0
5 0
6 1
7 2
8 3
9 4
Ответ 3
Другая возможность - использовать numpy.maximum(). Это более прямолинейно читать, на мой взгляд.
import pandas as pd
import numpy as np
df['value'] = np.maximum(df['value'], 0)
И это также на 2-3 раза быстрее.
In [21]: df = pd.DataFrame({'value': np.arange(-1000000,1000000)})
In [22]: %timeit df.loc[df['value']<0,'value'] = 0
10 loops, best of 3: 27.3 ms per loop
In [23]: df = pd.DataFrame({'value': np.arange(-1000000,1000000)})
In [24]: %timeit df['value'] = np.maximum(df['value'], 0)
100 loops, best of 3: 9.42 ms per loop
Ответ 4
Пусть принимают только значения, большие нуля, оставляя те, которые отрицательны, как NaN (работает с кадрами не с серией), а затем приписывают.