2016-12-12 9 views
2

numpyのアレイを含むデータフレーム列の各行の最大値を探す次パイソンパンダ:パンダデータフレームは次のように見ている私が得

 values          max_val_idx 
0 np.array([-0.649626, -0.662434, -0.611351])   2 
1 np.array([-0.994942, -0.990448, -1.01574])    1 
2 np.array([-1.012, -1.01034, -1.02732])     0 

df['values'] 3つの要素
の固定長のnumpyの配列を含んでいますdf['max_val_idx]は、対応するアレイの各アレイの最大要素のインデックスが既に与えられているので

の最大値のインデックス、各エントリの最大値を抽出するための最も効率的な方法は何が含まれていますか?
私はデータが幾分愚かに保存されていることを知っていますが、私はそれを自分で作成しませんでした。そして、処理するデータがたくさんあるので(+ 50GB、同様の方法で保存された何百ものピクルスデータベース)、私は最も時間効率の良い方法が何かを知りたいと思います。

は、これまでのところ私はdf['max_val_idx]の各要素をループしようとしたとdf['values']で見つかった各配列のインデックスとして使用:

max_val = []   
for idx, values in enumerate(df['values']): 
    max_val.append(values[int(df['max_val_idx'].iloc[idx])]) 

は、任意の速いこれに代わるありますか?

答えて

3

私は単に「max_val_idxを忘れてしまいます'列。私はそれが時間を節約したとは思わないし、実際には構文の苦痛である。サンプルデータ:

df = pd.DataFrame({ 'x': range(3) }).applymap(lambda x: np.random.randn(3)) 

                x 
0 [-1.17106202376, -1.61211460669, 0.0198122724315] 
1 [0.806819945736, 1.49139051675, -0.21434675401] 
2 [-0.427272615966, 0.0939459129359, 0.496474566... 

あなたはこのような最大取り出すことができます:

df.applymap(lambda x: x.max()) 

      x 
0 0.019812 
1 1.491391 
2 0.496475 

をしかし、あなたはセル当たり1つの番号を持っている場合、一般的に言えば、人生は簡単です。各セルは長さ3の配列を持っている場合は、次のように並べ替えることができます:

for i, v in enumerate(list('abc')): df[v] = df.x.map(lambda x: x[i]) 
df = df[list('abc')] 

      a   b   c 
0 -1.171062 -1.612115 0.019812 
1 0.806820 1.491391 -0.214347 
2 -0.427273 0.093946 0.496475 

そして標準パンダの操作を実行します。

df.apply(max, axis=1) 

      x 
0 0.019812 
1 1.491391 
2 0.496475 

を確かに、これは全体的に上記よりもはるかに簡単ではありませんが、データはこの形式で作業する方がはるかに簡単です。

+0

numpyのバージョンがDataFrameの基礎となる構造をより有効に活用できるので、値にPythonの組み込み 'max 'を適用するのではなく、' np.max(df、axis = 1) 'を使うのが有利かもしれません。 –

+0

私はちょうど試しましたが、それは良い提案です、そして、それはより遅かった - 私はなぜ分かりません。 – JohnE

+1

@JohnE:答えをありがとう。両方のソリューションを素早くテストした後、最初の方法は約20倍高速で、バリュー・アレーが大きくなるとより良いスケールになるようです。現時点では、「値」列から1つの数値だけを抽出するよりも、データで何もする必要はありません。しかし、あなたの2番目の方法を念頭に置いておきます。または単に最大値を選択する代わりに、idx-columnで指定された値を選択する必要があるかどうかを確認します。 – Jannick

2

私はすべての行の2次元マトリックスを構築していますので、私は、これの速度が比較されますかわからないが、ここで可能な解決策です:

>>> np.choose(df['max_val_idx'], np.array(df['values'].tolist()).T) 
0 -0.611351 
1 -0.990448 
2 -1.012000 
+0

私は最大限の質問をしたので、@ JohnEから提供された回答を受け入れる必要があります。しかし、一般的には、 'df ['max_val_idx']' -columnに指定されたインデックスに従って値を選択する必要があります。その場合、あなたのソリューションは非常に便利です。残念ながら、 'df ['max_val_idx']'の数値の 'dtype'は' float64'です。したがって、これらの数値をインデックスとして使用するための回避策を見つけなければなりません(安全なintキャスティング私が読んだ限り)。乾杯! – Jannick

関連する問題