2017-08-24 17 views
2

私はこのようなデータフレーム持っている:私は
DS [年] 2次元の辞書データフレームを取得するために、データフレームを分割するにはどうすればよい分割データフレーム

 df = pd.DataFrame({ 
       'Client':['A','B','C','D','E'], 
       'Revenue':[100,120,50,40,30], 
       'FYoQ':['FY','Q','Q','Q','FY'], 
       'Quarter':[np.nan,1,3,4,np.nan], 
       'Year':[2017,2016,2015,2017,2016] 
     }) 

[四半期]を毎年と四半期ごとに計算します。

今、私は次のよう1次元の辞書を行うことができる午前:

years=df['Year'].unique().tolist() 
    mc={elem:pd.DataFrame for elem in years} 

    for year in years: 
     mc[year]=df.loc[(df['Year']==year)] 

私はデータフレームのMC [2015]の辞書を得る。この方法は、MC [2016]など
そして私もう一度それぞれに同じことを適用する必要があります。

Iは、コードの変更があるだろう期待していた:高速なデータの分割を可能にする、一度に2次元(あるいは多次元辞書)を作成する

mc={elem:pd.DataFrame for elem in years} 

+0

あなたは、彼らが助け場合は受け入れとして私達の答えの1をマーク考慮すべきです。 –

答えて

2
from collections import defaultdict 

d = defaultdict(dict) 
[d[y].setdefault(q, g) for (y, q), g in df.groupby(['Year', 'Quarter'])]; 
d = dict(d) 

for y, v in d.items(): 
    print(y) 
    for q, s in v.items(): 
     print(' ' + str(q)) 
     p = s.__repr__() 
     p = '\n'.join(['  ' + l for l in p.split('\n')]) 
     print(p, '\n') 

2015 
    3.0 
      Client FYoQ Quarter Revenue Year 
     2  C Q  3.0  50 2015 

2016 
    1.0 
      Client FYoQ Quarter Revenue Year 
     1  B Q  1.0  120 2016 

2017 
    4.0 
      Client FYoQ Quarter Revenue Year 
     3  D Q  4.0  40 2017 
+0

使用上の注意(OPへ)として:単一レベル辞書は、2つの別個の検索を必要とするネストされたものよりも高速なアクセスを容易にする。 –

+1

合意!しかし、OPは2-Dを求めました。私はそれをOPと同じように見ています。あなたのニーズはOPのニーズです。 – piRSquared

+0

Totes right man。 –

2

IIUCでは、df.set_indexを使用してマルチインデックスを設定し、その後にdf.groupbyコールを設定できます。その後、dictの理解の内側にあなたの辞書を構築する:

dict_ = {i : g for i, g in df.set_index(['Year', 'Quarter']).groupby(level=[0, 1])} 

for k in dict_: 
    print(dict_[k]) 

      Client FYoQ Revenue 
Year Quarter      
2016 1.0   B Q  120 


      Client FYoQ Revenue 
Year Quarter      
2015 3.0   C Q  50 


      Client FYoQ Revenue 
Year Quarter      
2017 4.0   D Q  40 

キーは非常に管理している(year, quarter)タプル、です。


は、最後のループが .to_csvコールが必要になり、CSVファイルに保存するには:

for k in dict_: 
    label = 'data{}Q{}'.format(map(str, k)) 
    dict_[k].to_csv(label) 
+0

ありがとう、私はこれを試してみましょう。 –

+0

ありがとうございますこれは動作します。私は最終的なforループをどのように変更して、pd.to_csvに "data2015Q1.csv"、 "data2015Q2.csv"、....、 "data2016Q4"のような名前を自動的に取得するファイルをさまざまな結果ファイルに書き込むことができるのだろうかと思いました。 csv "... –

+0

@AlhpaDelta Edited。 '.to_csv'が必要です。 –

関連する問題