Comment remplacer les nombres négatifs dans le cadre de données Pandas par zéro
Je voudrais savoir s'il y a quelque chose de remplacer tous les nombres négatifs de DataFrame par des zéros?
25
demandé sur
Hangon
2015-01-03 23:14:14
3 réponses
Si toutes vos colonnes sont numériques, vous pouvez utiliser l'indexation booléenne:
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
Pour le cas plus général, cette réponse montre la méthode privée _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
Avec le type timedelta
, l'indexation booléenne semble fonctionner sur des colonnes séparées, mais pas sur l'ensemble du dataframe. Donc, vous pouvez faire:
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
Update: la comparaison avec un pd.Timedelta
fonctionne sur l'ensemble du 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
39
répondu
Lev Levitsky
2017-05-23 11:33:13
Une autre façon succincte de le faire est pandas.DataFrame.clip .
Par exemple:
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
Il y a aussi df.clip_lower(0)
.
23
répondu
follyroof
2017-09-29 11:17:00
Peut-être que vous pourriez utiliser pandas.where(args)
comme ceci:
data_frame = data_frame.where(data_frame < 0, 0)
5
répondu
aus_lacy
2015-01-04 00:58:13