Saltar al contenido

Cómo reemplazar números negativos en Pandas Data Frame por cero

Nuestros mejores investigadores agotaron sus depósitos de café, por su búsqueda diariamente por la respuesta, hasta que Alexia halló la solución en GitLab así que ahora la comparte aquí.

Si todas sus columnas son numéricas, puede usar la indexación booleana:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame('a': [0, -1, 2], 'b': [-3, 2, 1])

In [3]: df
Out[3]: 
   a  b
0  0 -3
1 -1  2
2  2  1

In [4]: df[df < 0] = 0

In [5]: df
Out[5]: 
   a  b
0  0  0
1  0  2
2  2  1

Para el caso más general, esta respuesta muestra el método privado. _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]: 
   a  b    c
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]: 
   a  b    c
0  0  0  foo
1  0  2  goo
2  2  1  bar

Con timedelta tipo, la indexación booleana parece funcionar en columnas separadas, pero no en todo el marco de datos. Entonces puedes hacer:

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]: 
        a       b
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]: 
       a      b
0 0 days 0 days
1 0 days 2 days
2 2 days 1 days

Actualizar: comparación con un pd.Timedelta funciona en todo el 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]: 
       a      b
0 0 days 0 days
1 0 days 2 days
2 2 days 1 days

Otra forma sucinta de hacer esto es pandas.DataFrame.clip.

Por ejemplo:

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

También hay df.clip_lower(0).

Tal vez podrías usar pandas.where(args) al igual que:

data_frame = data_frame.where(data_frame < 0, 0)

valoraciones y comentarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *