Как заменить отрицательные числа в кадре данных Pandas на ноль

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

3 Solutions collect form web for “Как заменить отрицательные числа в кадре данных Pandas на ноль”

Если все ваши столбцы являются числовыми, вы можете использовать булевское индексирование:

 In [1]: import pandas as pd In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1]}) In [3]: df Out[3]: ab 0 0 -3 1 -1 2 2 2 1 In [4]: df[df < 0] = 0 In [5]: df Out[5]: ab 0 0 0 1 0 2 2 2 1 

Для более общего случая этот ответ показывает частный метод _get_numeric_data :

 In [1]: import pandas as pd In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1], 'c': ['foo', 'goo', 'bar']}) In [3]: df Out[3]: abc 0 0 -3 foo 1 -1 2 goo 2 2 1 bar In [4]: num = df._get_numeric_data() In [5]: num[num < 0] = 0 In [6]: df Out[6]: abc 0 0 0 foo 1 0 2 goo 2 2 1 bar 

С типом timedelta логическое индексирование, по-видимому, работает с отдельными столбцами, но не по всему кадру данных. Таким образом, вы можете:

 In [1]: import pandas as pd In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'), ...: 'b': pd.to_timedelta([-3, 2, 1], 'd')}) In [3]: df Out[3]: ab 0 0 days -3 days 1 -1 days 2 days 2 2 days 1 days In [4]: for k, v in df.iteritems(): ...: v[v < 0] = 0 ...: In [5]: df Out[5]: ab 0 0 days 0 days 1 0 days 2 days 2 2 days 1 days 

Обновление: сравнение с pd.Timedelta работает на целом DataFrame:

 In [1]: import pandas as pd In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'), ...: 'b': pd.to_timedelta([-3, 2, 1], 'd')}) In [3]: df[df < pd.Timedelta(0)] = 0 In [4]: df Out[4]: ab 0 0 days 0 days 1 0 days 2 days 2 2 days 1 days 

Еще один лаконичный способ сделать это – pandas.DataFrame.clip .

Например:

 import pandas as pd In [20]: df = pd.DataFrame({'a': [-1, 100, -2]}) In [21]: df Out[21]: a 0 -1 1 100 2 -2 In [22]: df.clip(lower=0) Out[22]: a 0 0 1 100 2 0 

Также есть df.clip_lower(0) .

Возможно, вы можете использовать pandas.where(args) так:

 data_frame = data_frame.where(data_frame < 0, 0) 
  • Python: случайный выбор для каждой группы
  • Pandon pandas изменяет повторяющуюся временную метку на уникальный
  • Python - лучший язык программирования в мире.