2016-04-08 5 views
1

TLDR: DataFramesの配列を取り、その周囲にMultiIndexを構築する方法がわかりません。DataFramesの配列を単一のDataFrameに変換する

TLDR 2:私の研究からPool().Map()にグローバル/共有/単一データフレームのオフ動作するようにしようとするよりも、リターン結果に対処することをお勧めします。誰かがそれを共有する方法を持っているなら、私はそれのためにすべてです。


私はPool()によって返されたMultiIndexパンダのデータフレームの配列をマージしようとしています。 Map()機能。

p = Pool() 
results = p.map(run_experiment, experiment_collection) 

Pool().map()は配列として返します。プロセスが、[0:5]と第2の[0:50]という最初のインデックスを持つ1000 DataFrameの配列を返したとしましょう。

私が望むのは、各実験を分離する単一のDataFrameである最終出力を作成することです。[0:1000]/[0:5]/[0:50]


私はnp.zeros_likeを使用してマルチインデックスを作成し、データフレームを埋めるために方法を知っているが、私は、データフレームの配列を取得し、その周りにマルチインデックスを構築する方法を知りません。私の第一の例で

rounds = range(0,1000) 
levels = [... some set of levels ...] 
labels = [... some set of labels ...] 
iterables = [rounds, labels, levels] 

names = ['round', 'label', 'values'] 
index = pd.MultiIndex.from_product(iterables, names=names) 

index_names = [... some set of index names...] 
empty_df = pd.DataFrame(
       np.zeros_like(np.random.randn(5, 50000)), 
       index=index_names, 
       columns=index 
      ) 
      .sort_index() 
      .sort_index(axis=1) 

resultslevels/labelsのマルチインデックスデータフレームの配列です。私がしようとしているのは、トップレベル(これらすべてのDataFramesを保持する配列)を新しいインデックスに置き換える最終的なDataFrameを作成することです。

私はそれが1000のデータフレームの配列であるため、理にかなってValueError: Shape of passed values is (1, 1000), indices imply (shape of intended index)を取得しています

p = Pool() 
results = pd.DataFrame(
       p.map(run_experiment, experiment_collection), 
       index=index_names, 
       columns=index 
      ) 
      .sort_index() 
      .sort_index(axis=1) 

を試してみてください。

私は(行くには良い方法のように感じている)連結した場合

results = pd.concat(p.map(run_experiment, experiment_collection)) 

私はlevels/labelsとのデータフレームを取得し、ないround


pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, 
     keys=None, levels=None, names=None, verify_integrity=False) 

iterables = [rounds, labels, levels] 

は、私が戻ってデータフレームに私の roundsを取得するには、ここで操作しなければならないオプション(キー、レベル名)のかわからないんだけど。

results = pd.concat(
       p.map(run_experiment, experiment_collection), 
       levels=iterables, 
       names=names, 
       axis=1 
     ) 

私が望む形式に本当に近いですが、いいえroundを取得します。


私が必要な場合は具体的になることができますが、回答に役立つその他の情報は完全にはわかりません。

答えて

0

私は元のDataFrameを再作成し、返された結果をPool().Map()から繰り返し、各リストの位置をDataFrameに挿入します。よりよい方法が必要だと思われますが、私はそれを考えることはできません。

1)あなたはSeriesオブジェクトの束で開始する場合: あなたは、一連の設定がタプルであることをnameパラメータをオブジェクト

p = Pool() 
results = p.map(run_experiment, experiment_collection) 

final_df = pd.DataFrame(
      np.zeros_like(np.random.randn(5, 50000)), 
      index=index_names, 
      columns=index 
      ) 
      .sort_index() 
      .sort_index(axis=1) 

for result in results: 
    final_df[increment_value] = result 
0

はこれを行うには、いくつか良い方法があります。

2)データフレームの単一レベルのマップがある場合は、pd.concatが最初の引数としてdictを受け入れることができるという事実を利用することができます。例えば。

pd.concat({A:df1, B:df2}, axis=1) 

は、トップレベルとしてA、Bとのマルチレベルの指標とあなたが巣のdictsは、あなたがarbitary深さの指標を構築するために、この複数回行うことができますすることができない二level.AlthoughとしてあなたのDFの列を作成します。 。

3)DFでDataframeコンストラクタを使用できますが、タプルのリストを列名として渡すことができます。 E.f. df_new = pd.DataFrame(df、columns = [( "Foo"、 "A")、( "Foo"、 "B")])を実行すると、列A、マルチレベルインデックスを持つ新しいdfでは、dfのためにこれを個別に行い、それらを連結することができます。 Pandasは、2つのデータフレームを、同じ数のレベルのインデックスで適切に連結します。

関連する問題