2017-08-24 204 views
2

我有這樣一個數據幀:拆分數據幀dataframes

 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] 
     }) 

如何分割數據幀得到一個二維字典數據幀
DS [年] [季]每年和每季度。

現在我可以做一個一個維字典如下:

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年]等
然後我再必須對它們中的每一個應用相同的事物。

我希望有將是代碼的修改:

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

創建一個二維(或者甚至多維字典)一次,從而允許更快的數據的分裂。

+0

你應該考慮將其標記爲接受的,如果他們幫助了我們一個答案。 –

回答

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):單級字典有助於比需要兩次單獨查找的嵌套字典更快的訪問速度。 –

+1

同意!但是OP確實要求2-D。我認爲這是OP要求的。你的是OP的需求。 – piRSquared

+0

手提包正確的人。 –

2

IIUC,您可以使用df.set_index設置多索引,然後調用df.groupby。然後,建立你的字典的字典解析裏:

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)元組,這是非常易於管理。


要保存到CSV文件中,最後一個循環需要一個.to_csv電話:

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

謝謝,讓我試試這個。 –

+0

謝謝你的工作。我想知道如何修改最後一個for循環,以便我可以用自動獲取名稱的文件(如「data2015Q1.csv」,「data2015Q2.csv」,....,「data2016Q4)將pd.to_csv寫入各種結果文件。 csv「... –

+0

@AlhpaDelta編輯。你需要'.to_csv'。 –