2017-09-19 5 views
1

ペアワイズ操作を実行するために別のデータフレーム内の値を得るためにこれらの指標を使用し、私は、2つのデータフレームAとB1つのデータフレームの行あたりの上位n個の値を検索し、この場合

 c1 c2 c3    c1  c2  c3 
r0 7 6 4  r0  0  0  1 
r1 6 2 5  r1  1  1  0 
r2 3 5 9  r2  1  0  1 
を有します

Aは左側のデータフレームで、右側のBはデータフレームです。

基本的に私の目標は、Aの各行で上位2個の値を見つけ、Bに対応する行の値を見つけてから、これらの組の積の合計を取ることです。

たとえば、最初の行では、Aの先頭の値は7と6です。これはBの最初の行の0,0に対応します。次に7 * 0 + 6 * 0 = 0を返します。 。私はすべての行の上にこれを行うとのようなものを返すしたいと思います:

d1 0 
d2 6 
d3 9 

私は現在、Aの各行の上位n個の値のインデックスを見つけるためにnumpyのargsortを使用して実装を使用していて、次にマップと自己定義関数を使用して行を移動し、積和を求めます。

この方法は私にとっては非常に遅くなってしまったので、より速い選択肢があるかどうか疑問に思っていました。ありがとうございました。

答えて

2

rankを使用してトップ2の値を取得し、Bのマスクとして使用してください。

In [1311]: (A*B.where(A.rank(axis=1) >= 2)).sum(axis=1) 
Out[1311]: 
r0 0.0 
r1 6.0 
r2 9.0 
dtype: float64 

詳細

In [1314]: A.rank(axis=1) 
Out[1314]: 
    c1 c2 c3 
r0 3.0 2.0 1.0 
r1 3.0 1.0 2.0 
r2 1.0 2.0 3.0 

In [1315]: A.rank(axis=1) >=2 
Out[1315]: 
     c1  c2  c3 
r0 True True False 
r1 True False True 
r2 False True True 

In [1317]: B.where(A.rank(axis=1) >= 2) 
Out[1317]: 
    c1 c2 c3 
r0 0.0 0.0 NaN 
r1 1.0 NaN 0.0 
r2 NaN 0.0 1.0 

In [1318]: (A*B.where(A.rank(axis=1) >= 2)) 
Out[1318]: 
    c1 c2 c3 
r0 0.0 0.0 NaN 
r1 6.0 NaN 0.0 
r2 NaN 0.0 9.0 
+0

は期待と同じように働いて、それが私の実装よりもはるかに高速でした。助けてくれてありがとう! – Green

+0

フォローアップとして、AとBの各行を関数に渡したい合計ではなく、それを実行する最善の方法は何でしょうか?マスキングをした後と同じように、Aのすべての行とBの対応する行でmyfunc(Arow、Brow)を実行するようにします。 – Green

関連する問題