Установить максимальное значение (верхняя граница) в пандах 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
.