2016-07-30 54 views
5

假設我有3個相同長度的字典,我將其組合爲一個獨特的pandas數據框。然後,我將所述數據框轉儲到Excel文件中。例如:熊貓:將數據幀分割成多張同一電子表格

import pandas as pd 
from itertools import izip_longest 

d1={'a':1,'b':2,'c':3,'d':4,'e':5,'f':6} 
d2={'a':1,'b':2,'c':3,'d':4,'e':5,'f':6} 
d3={'a':1,'b':2,'c':3,'d':4,'e':5,'f':6} 

dict_list=[d1,d2,d3] 

stats_matrix=[ tuple('dict{}'.format(i+1) for i in range(len(dict_list))) ] + list(izip_longest(*([ v for k,v in sorted(d.items())] for d in dict_list))) 
stats_matrix.pop(0) 

mydf=pd.DataFrame(stats_matrix,index=None) 

mydf.columns = ['d1','d2','d3'] 

writer = pd.ExcelWriter('myfile.xlsx', engine='xlsxwriter') 
mydf.to_excel(writer, sheet_name='sole') 
writer.save() 

此代碼生成一個Excel與獨特表文件:

>Sheet1< 

d1 d2 d3 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 

我的問題:我怎樣可以切片此數據幀以這樣的方式使所得的Excel文件具有比方說3張表,其中標題重複出現,每張表中有兩行值?

EDIT

在給定的例子這裏的類型的字典具有各6個元件。在我的真實情況下,他們有25000,數據框的索引從1開始。所以我想將這個數據幀分成25個不同的子片,每個子片都被轉儲到同一個主文件的專用Excel工作表中。

預期結果:一個 Excel文件與張。標題重複。

>Sheet1<   >Sheet2<   >Sheet3< 

d1 d2 d3  d1 d2 d3  d1 d2 d3 
1 1 1  3 3 3  5 5 5 
2 2 2  4 4 4  6 6 6 

回答

3

首先準備你寫這樣的數據幀:

prepdf = mydf.groupby(mydf.index // 2).apply(lambda df: df.reset_index(drop=True)) 
prepdf 

enter image description here

您可以使用此功能,而不是重置你的索引。

def multiindex_me(df, how_many_groups=3, group_names=None): 
    m = np.arange(len(df)) 
    reset = lambda df: df.reset_index(drop=True) 
    new_df = df.groupby(m % how_many_groups).apply(reset) 
    if group_names is not None: 
     new_df.index.set_levels(group_names, level=0, inplace=True) 
    return new_df 

使用方法如下:

new_df = multiindex_me(mydf) 

或者:

new_df = multiindex_me(mydf, 
         how_many_groups=4, 
         group_names=['One', 'Two', 'Three', 'Four']) 

然後寫出每個橫截面不同的表是這樣的:

writer = pd.ExcelWriter('myfile.xlsx') 
for sheet in prepdf.index.levels[0]: 
    sheet_name = 'super_{}'.format(sheet) 
    prepdf.xs(sheet).to_excel(writer, sheet_name) 
writer.save() 
+0

什麼'SHEET_NAME ='super _ {}'。format(sheet)'do?是的,它命名牀單,但是如何? – FaCoffee

+0

另外,由於'mydf.index'從'1'開始,你如何從'0'開始? – FaCoffee

+1

@ CF84是字符串格式。我製作了「supe_」,可以是你選擇的任何東西。那裏的'{}'與'.format(sheet)'一起使用,其中'sheet'中的值被放置在字符串中{{}}的位置。所以你可以迭代'[0,1,2]'和'super_ {}'的值,format(sheet)'將會評估爲'super_0'','super_1''和''super_2' '。按照您認爲合適的方式替換它。 – piRSquared