2017-11-17 3 views
1

私は以下のデータフレームを持っています。 (これは必ずしもデータフレームではなく、numpyのアレイdf.valuesで解決策も十分であろう)列の値と配列のサイズ(または系列)を比較すると、

np.random.seed(42) 
df = pd.DataFrame(np.random.random((10,2)),columns=['a', 'b']) 
df 

     a   b 
0 0.374540 0.950714 
1 0.731994 0.598658 
2 0.156019 0.155995 
3 0.058084 0.866176 
4 0.601115 0.708073 
5 0.020584 0.969910 
6 0.832443 0.212339 
7 0.181825 0.183405 
8 0.304242 0.524756 
9 0.431945 0.291229 

Iは、以下の論理に従って値を持つ新しいカラム含める:

を真:そうでなければ

:特定のa値の後b値のいずれかがそのpartiulcar a値より大きい Falseの場合予想される出力は次のようになります。 は、上記のforループで可能でなければなりません

 a   b  c 
0 0.374540 0.950714 True 
1 0.731994 0.598658 True 
2 0.156019 0.155995 True 
3 0.058084 0.866176 True <- np.any(0.058084 < np.array([0.708073, 0.969910, 0.212339, 0.183405, 0.524756, 0.291229])) 
4 0.601115 0.708073 True <- np.any(0.601115 < np.array([0.969910, 0.212339, 0.183405, 0.524756, 0.291229])) 
5 0.020584 0.969910 True <- np.any(0.020584 < np.array([0.212339, 0.183405, 0.524756, 0.291229])) 
6 0.832443 0.212339 False <- np.any(0.832443 < np.array([0.183405, 0.524756, 0.291229])) 
7 0.181825 0.183405 True <- np.any(0.181825 < np.array([0.524756, 0.291229])) 
8 0.304242 0.524756 False <- np.any(0.304242 < np.array([0.291229])) 
9 0.431945 0.291229 UNDEFINED <- Ignore this 

(下記の行の一部の説明を参照)が、それをするパンダ/ numpyの方法は何ですか?

私はaにラムダ関数を適用するアプローチをしようとしていたが、lは上記のようnp.any比較を行うために、それぞれのa値のインデックスを取得する方法を見つけることができませんでした。

df['c'] = df['a'].apply(lambda x: np.any(x < df['b'].values[<i>:])) # Where <i> is the respective index value of x; which I didn't know how to find 

答えて

2

はトリックはbに下から上に行くと蓄積された最大値を探し、に対応する値に対して、それらを比較することであろう(私は後でapplyはしかし、forループのためだけ糖衣構文であることを発見しました) a

従って、実装があろう -

pandasにオーバー移植
a = df.a.values 
b = df.b.values 
out = a[:-1] < np.maximum.accumulate(b[::-1])[::-1][1:] 

、相手はnp.maximum.accumulateためdf.cummaxあろう。

サンプル実行 -

In [45]: df 
Out[45]: 
      a   b 
0 0.374540 0.950714 
1 0.731994 0.598658 
2 0.156019 0.155995 
3 0.058084 0.866176 
4 0.601115 0.708073 
5 0.020584 0.969910 
6 0.832443 0.212339 
7 0.181825 0.183405 
8 0.304242 0.524756 
9 0.431945 0.291229 

In [46]: out 
Out[46]: array([ True, True, True, True, True, True, False, True, False], dtype=bool) 
1

@Divakarで答えを補完するために、パンダはcummax()を使用して接近するようになります: `DF [ 'A']:

df['c'] = df['a'] < df['b'][::-1].cummax()[::-1].reset_index(drop=True).shift(-1) 

print(df) 

     a   b  c 
0 0.374540 0.950714 True 
1 0.731994 0.598658 True 
2 0.156019 0.155995 True 
3 0.058084 0.866176 True 
4 0.601115 0.708073 True 
5 0.020584 0.969910 True 
6 0.832443 0.212339 False 
7 0.181825 0.183405 True 
8 0.304242 0.524756 False 
9 0.431945 0.291229 False 
+0

がシフトが必要な場合があります。シフト(1) '? – Divakar

+0

ありがとう@Divakar!見逃した。 .df ['b'] [:: - 1] .cummax()[:: - 1] .reset_index(drop = True).shift(-1) 'を追加しました。ここでは 'df ['a']'をシフトできないと思う。 – akilat90

関連する問題