2015-01-03 40 views

答えて

30

すべての列が数値であれば、あなたはブールインデックスを使用することができます

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 

:より一般的なケースについては

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 

を、this answerはプライベートメソッド_get_numeric_dataを示しtimedeltaタイプでは、ブールインデックスは別々のカラムで動作するようです。bデータフレーム全体ではありません。だから、行うことができます。

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 

更新:全体のデータフレームのpd.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[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

おそらく、あなたがそうのようなpandas.where(args)を使用することができます。

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

これを行うもう1つの簡潔な方法はです。例えば

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)もあります。

関連する問題