データのコア(データベースなど)を格納するために使用している大きなDataFrame(million +)レコードがあり、次に、それぞれの列のいくつかを組み合わせている小さなDataFrame(1〜2000)レコードがあります。私のプログラムのタイムステップは、数千のタイムステップになる可能性があります。両方のDataFrameは、id列によって同じ方法でインデックス付けされます。
私が使用しているコードは次のとおりです。
df_large.loc[new_ids, core_cols] = df_small.loc[new_ids, core_cols]
ここで、core_colsは私が対処している約10個のフィールドのリストであり、new_idsは小さなDataFrameからのIDです。このコードは正常に機能しますが、私のコードの中で最も遅い部分であり、マグニチュードは3です。2つのDataFrameのデータをマージするためのより高速な方法かどうかを知りたかっただけです。
マージ機能を使用して毎回データをマージしようとしましたが、プロセスに時間がかかったため、速度を向上させるために更新するより大きなDataFrameを作成しました。
.loc
アライン可能なフレームで設定するために使用することについて本質的に遅いことは何もありませんが、それは多くの場合をカバーするために少しのコードを通過するので、おそらくタイトなループで持つことは理想的ではありません。参考までに、この例は2番目の例とは少し異なります。
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: from pandas import DataFrame
In [4]: df = DataFrame(1.,index=list('abcdefghij'),columns=[0,1,2])
In [5]: df
Out[5]:
0 1 2
a 1 1 1
b 1 1 1
c 1 1 1
d 1 1 1
e 1 1 1
f 1 1 1
g 1 1 1
h 1 1 1
i 1 1 1
j 1 1 1
[10 rows x 3 columns]
In [6]: df2 = DataFrame(0,index=list('afg'),columns=[1,2])
In [7]: df2
Out[7]:
1 2
a 0 0
f 0 0
g 0 0
[3 rows x 2 columns]
In [8]: df.loc[df2.index,df2.columns] = df2
In [9]: df
Out[9]:
0 1 2
a 1 0 0
b 1 1 1
c 1 1 1
d 1 1 1
e 1 1 1
f 1 0 0
g 1 0 0
h 1 1 1
i 1 1 1
j 1 1 1
[10 rows x 3 columns]
これが代替案です。データパターンに適合する場合と適合しない場合があります。更新(小さなフレーム)がほとんど独立している場合、これは機能します(つまり、大きなフレームを更新せず、新しいサブフレームを選択してから更新するなどです。これがパターンの場合、使用.loc
は約正しい)。
大きなフレームを更新する代わりに、大きなフレームの列で小さなフレームを更新します。例:
In [10]: df = DataFrame(1.,index=list('abcdefghij'),columns=[0,1,2])
In [11]: df2 = DataFrame(0,index=list('afg'),columns=[1,2])
In [12]: needed_columns = df.columns-df2.columns
In [13]: df2[needed_columns] = df.reindex(index=df2.index,columns=needed_columns)
In [14]: df2
Out[14]:
1 2 0
a 0 0 1
f 0 0 1
g 0 0 1
[3 rows x 3 columns]
In [15]: df3 = DataFrame(0,index=list('cji'),columns=[1,2])
In [16]: needed_columns = df.columns-df3.columns
In [17]: df3[needed_columns] = df.reindex(index=df3.index,columns=needed_columns)
In [18]: df3
Out[18]:
1 2 0
c 0 0 1
j 0 0 1
i 0 0 1
[3 rows x 3 columns]
そして、必要に応じてすべてを連結します(その間、リストに保持されるか、以下の私のコメントを参照してください。これらのサブフレームは、作成時に外部ストレージに移動し、この連結手順の前に読み戻すことができます)。
In [19]: pd.concat([ df.reindex(index=df.index-df2.index-df3.index), df2, df3]).reindex_like(df)
Out[19]:
0 1 2
a 1 0 0
b 1 1 1
c 1 0 0
d 1 1 1
e 1 1 1
f 1 0 0
g 1 0 0
h 1 1 1
i 1 0 0
j 1 0 0
[10 rows x 3 columns]
このパターンの利点は、実際のデータベース(またははるかに優れたHDFStore
)を使用して「データベース」を実際に保存し、必要に応じてサブフレームを作成/更新し、終了時に新しいストアに書き出すように簡単に拡張できることです。。
私はいつもこのパターンを使用していますが、実際にはパネルを使用しています。
マルチプロセスを使用して計算を実行し、個々のパネルをすべて完全に独立しているため、個別のファイルに書き込むことができます。唯一の依存部分は連結です。
これは本質的にmap-reduceパターンです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加