2017-09-10 1 views
2

私は、まばらにデータが入っているデータフレームを持っています。ほとんどの値は空白です。他の値は「Buy」と「Sell」だけです。最後の空白以外の値が '購入'だった場合は空白値を 'long'に置き換え、最後の空白以外の値が '売り'だった場合は 'short'を置き換えたいと思います。私はこれをループで十分に簡単に行うことができますが、これを達成するための非虚偽の方法があるのだろうかと疑問に思っていますか?pandasデータフレームの空白値を条件付きで置き換えよう

答えて

0

あなたは(メソッドffillfillna - NaN sおよびNone Sを充填転送)fillnaまたはcombine_firstを使用するためのreplaceffillでヘルパーdfによって作成されたNone Sを置き換えることができます。

np.random.seed(12) 
df = pd.DataFrame({'A':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)), 
        'B':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6)), 
        'C':np.random.choice(['Buy','Sell', None], 10, p=(.2,.2,.6))}) 

print (df) 

     A  B  C 
0 Buy Sell None 
1 None None Buy 
2 Sell None Buy 
3 None None Buy 
4 Buy Buy Sell 
5 None None None 
6 None None None 
7 Buy None None 
8 None None Sell 
9 Buy Buy None 

df = df.fillna(df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
#alternative solution 
#df = df.combine_first(df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
print (df) 
     A  B  C 
0 Buy Sell None 
1 long short Buy 
2 Sell short Buy 
3 short short Buy 
4 Buy Buy Sell 
5 long long short 
6 long long short 
7 Buy long short 
8 long long Sell 
9 Buy Buy short 

説明:

print (df.replace({'Sell':'short', 'Buy':'long'})) 
     A  B  C 
0 long short None 
1 None None long 
2 short None long 
3 None None long 
4 long long short 
5 None None None 
6 None None None 
7 long None None 
8 None None short 
9 long long None 

print (df.replace({'Sell':'short', 'Buy':'long'}).ffill()) 
     A  B  C 
0 long short None 
1 long short long 
2 short short long 
3 short short long 
4 long long short 
5 long long short 
6 long long short 
7 long long short 
8 long long short 
9 long long short 
+0

ありがとうございます。あなたの答えの最初のブロックは、私が探しているものとまったく同じように思えます。購入した商品と売り手は保存され、ブランクはロングとショートに置き換えられます。説明(ブロック2)では、結果は完全にロングとショート買収と売却はなくなった。あなたのコードを見ると、後者は私が期待していたものです。しかし、あなたのコードを試して、私は前者を取得します - これは私が望んだものです。私は買い物を長いものに、売り物を短いものに置き換えているように見えます。しかし、なぜオリジナルの買物と売りは保持されていますか? – dborger

+0

私は 'df.fillna'を' replace'と 'ffill'によって作成された' df'で2番目に使用しています。したがって、元の 'Nones'を2番目の' df 'の値で置き換えます。同様に 'combine_first'を動作させます。 – jezrael

関連する問題