2017-11-18 14 views
2

他のデータフレーム(df2)にデータを入力するためのデータフレーム(df1)があります。 df1の値が54より大きい場合、私はdf2の同じ行を "Buy"列の下で "Buy"にし、そうでなければ "sell"列の下に "Sell"したいとします。私はこれが簡単だと思いますが、何らかの理由で私が下のコードでこれをしていたとき、df1の最後の値に基づいてdf2のすべての値を設定していました。パンダのデータフレーム - df1の基準に基づいてdf2を設定する

for x in df1['A']: 
    if x > 54: 
     df2['Buy'] = "Buy" 

    else: 
     df2['Sell'] = "Sell" 

DF1:

Date 
    2011-08-26  53.024284 
    2011-08-29  55.454285 
    2011-08-30  55.464287 
    2011-08-31  55.795715 
    2011-09-01  55.117142 
    2011-09-02  53.534286 

df2: 

      Buy Hold Sell 
Date 
2011-08-26 0.0 0.0 0.0 
2011-08-29 0.0 0.0 0.0 
2011-08-30 0.0 0.0 0.0 
2011-08-31 0.0 0.0 0.0 
2011-09-01 0.0 0.0 0.0 
2011-09-02 0.0 0.0 0.0 

答えて

2

使用np.whereすなわち

df2['Buy'] = np.where(df1['A']>54,'Buy',df2['Buy']) 
df2['Sell'] = np.where(df1['A']<54,'Sell',df2['Sell']) 

またはdf.whereすなわち

df2['Buy'] = df2['Buy'].where(df1['A']<54,'Buy') 
df2['Sell'] = df2['Sell'].where(df1['A']>54,'Sell') 

出力:

 
      Buy Hold Sell 
Date      
2011-08-26 0.0 0.0 Sell 
2011-08-29 Buy 0.0 0.0 
2011-08-30 Buy 0.0 0.0 
2011-08-31 Buy 0.0 0.0 
2011-09-01 Buy 0.0 0.0 
2011-09-02 0.0 0.0 Sell 

インデックスが同じでない場合は、ソリューションの@jezraelで提案されているようにインデックスを再作成する必要があります。

4

まずnecessarry両方のインデックスが同じであるとし、別のデータフレームdf2df1状態で作成された可能性の使用ブールマスクです:

assignと同じ
m = df1['A'] > 54 
df2['Buy'] = df2['Buy'].mask(m, "Buy") 
df2['Sell'] = df2['Sell'].mask(~m, "Sell") 

df2 = df2.assign(Buy= df2['Buy'].mask(m, "Buy"),Sell = df2['Sell'].mask(~m, "Sell")) 

または:

df2.loc[m, 'Buy'] = "Buy" 
df2.loc[~m, 'Sell'] = "Sell" 

print (df2) 
      Buy Hold Sell 
Date      
2011-08-26 0 0.0 Sell 
2011-08-29 Buy 0.0  0 
2011-08-30 Buy 0.0  0 
2011-08-31 Buy 0.0  0 
2011-09-01 Buy 0.0  0 
2011-09-02 0 0.0 Sell 

インデックスは異なる使用reindexている場合:

m = (df1['A'] > 54).reindex(df2.index, fill_value=False) 
+1

卿あなたは、インデックスの再作成によって私を得ました。これを覚えています。私は初めてマスクの再インデックスを見ている:) – Dark

関連する問題