2017-07-07 16 views
1

私は541列のDataFrame dfを持っています。列名のすべてのユニークなペアを個別のDataFrameの行に8回繰り返し保存する必要があります。パンダのDataFrameにアクセスする最も速い方法は何ですか?

私は空のDataFrame fpを作成し、dfの列名を2回ループし、8行目ごとに挿入し、空白を最後に使用可能な値で埋めると考えました。

私はこれをやろうとしたが、どれくらいの時間がかかっているのか困惑していた。 541のコラムで、私は146,611回書く必要がありますが、それは20分を十分に費やしています。これはちょうどデータアクセスのために大変なようです。問題はどこにあり、どのように解決できますか? Pandasが列との相関行列を生成するよりも時間がかかりますので、私は何か間違っていなければなりません。ここで

は、私が何を意味するかの再現性の例です:

fp = np.empty(shape = (146611, 10)) 
fp.fill(np.nan) 

fp = pd.DataFrame(fp) 

%timeit for idx in range(0, len(fp)): fp.iloc[idx, 0] = idx 

# 1 loop, best of 3: 22.3 s per loop 

答えて

6

はILOC/LOC /チェーン・インデックスをしないでください。 NumPyインターフェイスだけを使用すると、スピードが〜180倍向上します。要素アクセスをさらに削除すると、これを180,000xに上げることができます。

fp = np.empty(shape = (146611, 10)) 
fp.fill(np.nan) 

fp = pd.DataFrame(fp) 

# this confirms how slow data access is on my computer 
%timeit for idx in range(0, len(fp)): fp.iloc[idx, 0] = idx 

1 loops, best of 3: 3min 9s per loop 

# this accesses the underlying NumPy array, so you can directly set the data 
%timeit for idx in range(0, len(fp)): fp.values[idx, 0] = idx 

1 loops, best of 3: 1.19 s per loop 

〜ループあたり10μsの服用、このfancingのインデックス作成のためのPythonの層に行く広範囲のコードがありますので、これがあります。 Pandasを使用すると、データのサブセット全体を取得し、データフレーム全体でベクトル化された操作を行うためにインデックスを作成する必要があります。個々の要素へのアクセスは氷河です:Python辞書を使用すると、パフォーマンスが180倍以上向上します。

個々の要素ではなく列または行にアクセスすると、3桁の精度が向上します。

# set all items in 1 go. 
%timeit fp[0] = np.arange(146611) 
1000 loops, best of 3: 814 µs per loop 

道徳

連鎖インデックス、loc、またはilocを経由して、個々の要素にアクセスしようとしないでください。 Pythonリスト(またはパフォーマンスが絶対的に重要な場合はCインタフェース)から単一の割り当てでNumPy配列を生成し、次に列全体またはデータフレームに対して操作を実行します。

NumPy配列を使用し、個々の要素ではなく列に対して直接操作を実行すると、パフォーマンスが18万倍以上向上しました。汚すぎる格好はやめて。

関連する問題