2016-08-04 5 views
1

パネルに2つのパンダデータフレームがあり、最初のdf(行単位)をランク付けする第3のdfを作成したいが、 dfは真です。いくつかのサンプルデータを説明するために:私はいくつかの醜いハックでこれを行うために管理しているが、まだランクが私は非数値データに「最初の」=メソッドを使用させないであろうという事実にはまり込むパネル内の他のブール値のデータフレームに従ったインクリメントランクのパンダデータフレーム

p['x']    
        A   B   C   D   E 
2015-12-31 0.957941 -0.686432 1.087717 1.363008 -1.528369 
2016-01-31 0.079616 0.524744 1.675234 0.665511 0.023160 
2016-02-29 -0.300144 -0.705346 -0.141015 1.341883 0.855853 
2016-03-31 0.435728 1.046326 -0.422501 0.536986 -0.656256 


p['y'] 
       A  B  C  D E 
2015-12-31 True False True False NaN 
2016-01-31 True True True False NaN 
2016-02-29 False True True True NaN 
2016-03-31 NaN NaN NaN NaN NaN 

。ブール値dfにTrueを持たないセルに対しては、増分整数ランク(重複していても)とNaNを強制したい。

出力の形式は次のようになります。

   A B C D E 
2015-12-31 2.0 NaN 1.0 NaN NaN 
2016-01-31 3.0 2.0 1.0 NaN NaN 
2016-02-29 NaN 3.0 2.0 1.0 NaN 
2016-03-31 NaN NaN NaN NaN NaN 

私のハッキングの試みは以下の通りです。 NaNとfalseを置き換えるには、はっきりとした方法が必要ですが、動作します。しかし、一度メソッド= 'first'を追加すると動作しません。重複した値のインスタンスがある可能性があるので、これは必要です。

# I first had to hack a replacement of False with NaN. 
# np.nan did not evaluate correctly 
# I wasn't sure how else to specify pandas NaN 
rank=p['Z'].replace(False,p['Z'].iloc[3,0]) 

# eliminate the elements without a corresponding True 
rank=rank*p['X'] 

# then this works 
p['rank'] = rank.rank(axis=1, ascending=False) 

# but this doesn't 
p['rank'] = rank.rank(axis=1, ascending=False, method='first') 

ご協力いただければ幸いです。 おかげ

  1. リスト項目
+0

あなたが第三DFの所望の結果を共有することができます...何をされます一度私はメソッド= 'first'をランクのパラメータに追加します。何らかの理由で、 '最初の'パラメータが私の(醜い)実装ではうまくいかないでしょう。 – nitin

答えて

2
pd.DataFrame(np.where(p['y'] == True, p['x'], np.nan), 
      p.major_axis, p.minor_axis).rank(1, ascending=False) 

enter image description here

はあなたのコードは、これまで
+0

おかげで非常に多く、これが行う – tmasters

+0

うれしい私は助けることができます。 – piRSquared

+0

@piRSquared私はまず、 '= True'、' np.where(p ['y']、p ['x']、np.nan) 'を省略することができると思います。除去された。 – jezrael

関連する問題