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)