2015-01-03 12 views

risposta

30

Se tutte le colonne sono numerici, è possibile utilizzare l'indicizzazione booleano:

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 

Per il caso più generale, this answer illustra il metodo privato _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 il tipo timedelta, l'indicizzazione booleana sembra funzionare su colonne separate, b non su tutto il dataframe. Così si può fare:

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 

Aggiornamento: confronto con un pd.Timedelta opere su tutto il 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 
4

Forse si potrebbe usare pandas.where(args) in questo modo:

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

Un altro modo succinto per farlo è pandas.DataFrame.clip.

Ad esempio:

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 

C'è anche df.clip_lower(0).

Problemi correlati