Установить максимальное значение (верхняя граница) в пандах DataFrame

Я пытаюсь установить максимальное значение столбца DataFrame панд. Например:

my_dict = {'a':[10,12,15,17,19,20]}
df = pd.DataFrame(my_dict)

df['a'].set_max(15)

даст:

    a
0   10
1   12
2   15
3   15
4   15
5   15

Но это не так.

Есть миллион решений, чтобы найти максимальное значение, но ничего, чтобы установить максимальное значение... по крайней мере, я могу найти.

Я мог бы пройтись по списку, но я подозреваю, что есть более быстрый способ сделать это с пандами. Мои списки будут значительно длиннее, и поэтому я ожидаю, что итерация займет относительно больше времени. Кроме того, я хотел бы, чтобы любое решение было в состоянии справиться с NaN.

Ответ 1

Я полагаю, вы можете сделать:

maxVal = 15
df['a'].where(df['a'] <= maxVal, maxVal)      # where replace values with other when the 
                                              # condition is not satisfied

#0    10
#1    12
#2    15
#3    15
#4    15
#5    15
#Name: a, dtype: int64

Или:

df['a'][df['a'] >= maxVal] = maxVal

Ответ 2

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

Применить ко всем столбцам фрейма данных:

df.clip(upper=15)

В противном случае примените к выбранным столбцам, как показано здесь:

df.clip(upper=pd.Series({'a': 15}), axis=1)

Ответ 3

numpy.clip - хорошая и быстрая альтернатива.

df

    a
0  10
1  12
2  15
3  17
4  19
5  20

np.clip(df['a'], a_max=15, a_min=None)

0    10
1    12
2    15
3    15
4    15
5    15
Name: a, dtype: int64

# Or,
np.clip(df['a'].to_numpy(), a_max=15, a_min=None)
# array([10, 12, 15, 15, 15, 15])

Начиная с версии v0.21 вы также можете использовать DataFrame.clip_upper.

Заметка
Этот метод (вместе с clip_lower) устарел с v0.24 и будет удален в следующей версии.

df.clip_upper(15)

    a
0  10
1  12
2  15
3  15
4  15
5  15

Аналогичным образом, если вы хотите установить только нижнюю границу, используйте DataFrame.clip_lower. Эти методы также доступны для объектов Series.