2015-10-20 17 views
5

でパンダのデータフレームのためのif文:私はこのようになりますデータフレーム持っているPythonの

dirt = dirt.astype(float) 
for ind, i in enumerate(dirt): 
    if i < 0: 
     dirt[ind] = i + 360 
    if i > 360: 
     dirt[ind] = i - 360 
を:私は、データフレーム内のすべての値に if文の基準を課す必要がある

timestamp      0   1   2   3           
2013-04-17 05:00:00  4.335212 2655.140854 2655.140854 2655.140854 
2013-04-17 05:10:00  2.224966 2655.140854 2655.140854 2655.140854 
2013-04-17 05:20:00  2.409150 2655.140854 2655.140854 2655.140854 
2013-04-17 05:30:00 2655.140854 2655.140854 2655.140854 2655.140854 

は、私が使用して試してみました

ただし、加算と減算はいずれの値でも発生していません。何か案は?

答えて

3

enumerate(df)の代わりに.iterrows()を使用してください。 enumerate(df)を実行すると、条件に合わない列名が表示されます。 iterrows()は、繰り返しごとにインデックスと行(pandas.Series)を返します。

ただし、ご希望の場合は、df.columnsを繰り返し処理して、すべての列に対してベクトル化された方法で行います。例 - 私は、したがって、我々ははるかに少ない反復で実際のループを行う(およびためのベクトル化に加えを使用されるだろう、行数よりもはるかに少ないだろう列の数を想定しcolumns代わりのrowsを使用しています

for col in df.columns: 
    df.loc[df[col] < 0,col] += 360 
    df.loc[df[col] > 360,col] -= 360 

より多くのデータを同時に)。

デモ -

In [128]: df 
Out[128]: 
           0   1   2   3 
timestamp 
2013-04-17 05:00:00  4.335212 2655.140854 2655.140854 2655.140854 
2013-04-17 05:10:00  2.224966 2655.140854 2655.140854 2655.140854 
2013-04-17 05:20:00  2.409150 2655.140854 2655.140854 2655.140854 
2013-04-17 05:30:00 2655.140854 2655.140854 2655.140854 2655.140854 

In [134]: for col in df.columns: 
    .....:  df.loc[df[col] < 0,col] += 360 
    .....:  df.loc[df[col] > 360,col] -= 360 
    .....: 

In [135]: df 
Out[135]: 
           0   1   2   3 
timestamp 
2013-04-17 05:00:00  4.335212 2295.140854 2295.140854 2295.140854 
2013-04-17 05:10:00  2.224966 2295.140854 2295.140854 2295.140854 
2013-04-17 05:20:00  2.409150 2295.140854 2295.140854 2295.140854 
2013-04-17 05:30:00 2295.140854 2295.140854 2295.140854 2295.140854 
3

あなたはこのような既存のデータフレームの値を更新するwhereupdateでマスキングを使用することがあります。

In [188]: df 
Out[188]: 
           0   1   2   3 
timestamp                
2013-04-1705:00:00  4.335212 2655.140854 2655.140854 2655.140854 
2013-04-1705:10:00  2.224966 2655.140854 2655.140854 2655.140854 
2013-04-1705:20:00  2.409150 2655.140854 2655.140854 2655.140854 
2013-04-1705:30:00 2655.140854 2655.140854 2655.140854 2655.140854 

In [189]: df_small = df.where(df < 0).apply(lambda x: x + 360) 

In [190]: df_small 
Out[190]: 
        0 1 2 3 
timestamp       
2013-04-1705:00:00 NaN NaN NaN NaN 
2013-04-1705:10:00 NaN NaN NaN NaN 
2013-04-1705:20:00 NaN NaN NaN NaN 
2013-04-1705:30:00 NaN NaN NaN NaN 

In [191]: df_large = df.where(df > 360).apply(lambda x: x - 360) 

In [192]: df_large 
Out[192]: 
           0   1   2   3 
timestamp                
2013-04-1705:00:00   NaN 2295.140854 2295.140854 2295.140854 
2013-04-1705:10:00   NaN 2295.140854 2295.140854 2295.140854 
2013-04-1705:20:00   NaN 2295.140854 2295.140854 2295.140854 
2013-04-1705:30:00 2295.140854 2295.140854 2295.140854 2295.140854 

In [193]: df.update(df_small) 

In [194]: df.update(df_large) 

In [195]: df 
Out[195]: 
           0   1   2   3 
timestamp                
2013-04-1705:00:00  4.335212 2295.140854 2295.140854 2295.140854 
2013-04-1705:10:00  2.224966 2295.140854 2295.140854 2295.140854 
2013-04-1705:20:00  2.409150 2295.140854 2295.140854 2295.140854 
2013-04-1705:30:00 2295.140854 2295.140854 2295.140854 2295.140854 

注:

これは、 "値" < 360、+360 else -360のような条件が発生した場合、コーナーケースに対応する可能性がありますが、更新のシーケンスによって結果が再適用されます。 1 + 360 = 361、次に361> 360となり、再び1になる。

しかし、あなたのユースケースでは、@ AnandSKumarの方法は非常にきれいで、あなたが探しているものに近いと思います。

関連する問題