2016-07-30 13 views
5

Aynı uzunluktaki 3 sözlükten biriyim de, ben benzersiz bir pandas veriye birleştiriyorum. Daha sonra söz konusu veri çerçevesini bir Excel dosyasına döküyorum. Örnek:Pandalar: Bir veri çerçevesini aynı elektronik tablonun birden çok sayfasına dilimleme

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() 

Bu kod bir Excel bir benzersiz levha dosyası üretir:

>Sheet1< 

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

Sorum: Ben sonuçlanan Excel dosyası olduğunu şekilde bu dataframe dilim nasıl diyelim ki, başlıkların tekrarlandığı ve her bir sayfada iki sıra değer bulunan 3 sayfa var mı?

Verilen örnekte DÜZENLEME

burada dicts 6 elemanlı her vardır. Benim gerçek durumumda, 1'dan başlayarak veri tabanının indeksi 25000'dir. Bu nedenle, bu veri çerçevesini her biri aynı ana dosyaya ayrılmış bir Excel sayfasına dökülmüş 25 farklı alt dilime ayırmak istiyorum.

Amaçlanan sonuç: bir Excel birden yaprak dosyasıdır. Başlıklar tekrarlanır. Böyle yazmaya için dataframe

>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 

cevap

3

İlk hazırlık:

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

enter image description here

yerine size endeksi sıfırlamak için bu işlevi kullanabilirsiniz.

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 

böyle kullanın:

new_df = multiindex_me(mydf) 

Veya:

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

O zaman bu gibi farklı bir sayfaya her kesiti yazın: ne yapar

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 (sayfa) 'yapmak? Evet, çarşafları adlandırıyor, ama nasıl? – FaCoffee

+0

Ayrıca, mydf.index' '1'den başladığından, onu '0' dan başlatabilirsiniz? – FaCoffee

+1

@ CF84, dize biçimlendirmesidir. Ben 'supe_' 'yaptım ve seçtiğiniz herhangi bir şey olabilir. "{}", ".format (sayfa)" ile gider; burada "sayfa" içindeki değer, "{}" dizgesinin olduğu yerde yerleştirilir. Böylece, [0, 1, 2] ve '' süper _ {} 'formatını (sayfa)' 'super_0' ',' 'super_1' 've' 'super_2' 'olarak değerlendirirsiniz. '. Uygun gördüğünüz gibi değiştirin. – piRSquared

İlgili konular