2017-03-15 2 views
0

次のコードは、値-1、0または1でランダムなデータフレームを作成します。パンダを使用して条件付き累積合計で新しい列を作成するにはどうすればよいですか?

df = pd.DataFrame(np.random.randint(-1,2,size=(100, 1)), columns=['val']) 

print(df['val'].value_counts()) 

のは、それが含まれているか見てみましょう:私はと呼ばれる新しい列を作成しようとしている、

-1 36 
0 35 
1 29 
Name: val, dtype: int64 

その後ヴァル= 1とmysum> = 0、次いでmysum = mysum + 1場合

  • :次の規則に従って累積条件和と
  • 場合ヴァル= 1とmysum < 0、次いでmysum = mysum + 2

  • 場合ヴァル= -1とmysum < = 0、次いでmysum = mysum - 1

  • 場合ヴァル= -1とmysum> 0、次いでmysum = mysum - 2

  • valは= 0とmysum < 0の場合、mysum = mysum + 1

  • valは= 0とmysum> 0の場合、mysum = mysum - 1

  • val = 0かつmysum = 0の場合は、mysum = mysumです。

だから私はのように単純ではありません怖い:

df['mysum'] = 0 

df['mysum'] = np.where((df['val'] == 1) & (df['mysum'].cumsum() >= 0), (df['mysum'].cumsum() + 1), df['mysum'].cumsum()) 
df['mysum'] = np.where((df['val'] == 1) & (df['mysum'].cumsum() < 0), (df['mysum'].cumsum() + 2), df['mysum'].cumsum()) 

df['mysum'] = np.where((df['val'] == -1) & (df['mysum'].cumsum() <= 0), (df['mysum'].cumsum() - 1), df['mysum'].cumsum()) 
df['mysum'] = np.where((df['val'] == -1) & (df['mysum'].cumsum() > 0), (df['mysum'].cumsum() - 2), df['mysum'].cumsum()) 

df['mysum'] = np.where((df['val'] == 0) & (df['mysum'].cumsum() > 0), (df['mysum'].cumsum() - 1), df['mysum'].cumsum()) 
df['mysum'] = np.where((df['val'] == 0) & (df['mysum'].cumsum() < 0), (df['mysum'].cumsum() + 1), df['mysum'].cumsum()) 


print(df['mysum'].value_counts()) 
print(df) 

をしかし、列mysumが蓄積されていません。だから私は、次のことを試してみました

df['mysum'] = df['val'].cumsum() 

!ここで

はあなたが試すことができますフィドルです: https://repl.it/FaXZ/8

+0

mysumと現在のvalの両方が0の場合、mysumに何が起こりますか? –

+0

私は実現しなかった!私もこのcasuisticを追加しました!ありがとうございました – harrison4

+0

(ループするソリューションを投稿することはお勧めできません...) – ntg

答えて

1

たぶん多くの濃縮液が存在しますが、データフレームをループし、設定された値、あなたの条件に応じてすることができます。

import numpy as np 
import pandas as pd 

df = pd.DataFrame(np.random.randint(-1, 2, size=(100, 1)), columns=['val']) 

df['mysum'] = 0 

for index, row in df.iterrows(): 

    # get the current value of mysum = mysum one row above current index 
    mysum = df.get_value(index - 1, 1, takeable=True) 

    # mysum at beginning is 0 
    if index == 0: 
     mysum = 0 

    # set values at current index according to conditions 
    if row[0] == 0 and mysum < 0: 
     df.set_value(index, 1, mysum + 1, takeable=True) 
    if row[0] == 1 and mysum < 0: 
     df.set_value(index, 1, mysum + 2, takeable=True) 
    if row[0] == -1 and mysum <= 0: 
     df.set_value(index, 1, mysum - 1, takeable=True) 
    if row[0] == 0 and mysum > 0: 
     df.set_value(index, 1, mysum - 1, takeable=True) 
    if row[0] == -1 and mysum > 0: 
     df.set_value(index, 1, mysum - 2, takeable=True) 
    if row[0] == 1 and mysum >= 0: 
     df.set_value(index, 1, mysum + 1, takeable=True) 
    if row[0] == 0 and mysum == 0: 
     df.set_value(index, 1, mysum, takeable=True) 

print df 
関連する問題