Подтвердить что ты не робот

Возврат макс нуля или значения для столбца pandas DataFrame

Я хочу заменить отрицательные значения в столбце pandas DataFrame с нулем.

Есть ли более сжатый способ построения этого выражения?

df['value'][df['value'] < 0] = 0
4b9b3361

Ответ 1

Вот канонический способ сделать это, хотя и не обязательно более кратким, более гибким (в том, что вы можете применить это к произвольным столбцам)

In [39]: df = DataFrame(randn(5,1),columns=['value'])

In [40]: df
Out[40]: 
      value
0  0.092232
1 -0.472784
2 -1.857964
3 -0.014385
4  0.301531

In [41]: df.loc[df['value']<0,'value'] = 0

In [42]: df
Out[42]: 
      value
0  0.092232
1  0.000000
2  0.000000
3  0.000000
4  0.301531

Ответ 2

Вы можете использовать метод клипа:

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 (работает с кадрами не с серией), а затем приписывают.

df[df > 0].fillna(0)