2016-07-30 10 views
5

Powiedz, że mam 3 słowniki o tej samej długości, które łączę w unikalną ramkę danych pandas. Następnie zrzucam wspomnianą ramkę danych do pliku Excel. Przykład:Pandy: cięcie ramki danych na wiele arkuszy tego samego arkusza kalkulacyjnego

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

Kod ten tworzy plik Excel z wyjątkowy arkusza:

>Sheet1< 

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

Moje pytanie: jak mogę kroić tę dataframe w taki sposób, że wynikowy plik Excel powiedzmy 3 arkusze, w których nagłówki są powtarzane, aw każdym arkuszu są dwa wiersze wartości?

EDIT

W przykładzie przedstawionym tutaj na dicts mieć 6 elementów każdy. W moim prawdziwym przypadku mają one 25000, indeks frameworka danych zaczynając od 1. Tak więc chcę podzielić tę ramkę danych na 25 różnych pod-plasterków, z których każdy jest zrzucany do dedykowanego arkusza Excela tego samego głównego pliku.

Zamierzony wynik: jeden plik Excel z wielu arkuszy. Nagłówki są powtarzane.

>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 

Odpowiedz

3

Pierwszy prep dataframe za napisanie tak:

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

enter image description here

Można użyć tej funkcji, aby przywrócić Ci indeks zamiast.

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 

Używaj go tak:

new_df = multiindex_me(mydf) 

czyli

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

następnie napisać każdy przekrój do innego arkusza jak ten:

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

Co 'SHEET_NAME = 'super _ {}'. format (arkusz) 'zrobić? Tak, nazywa arkusze, ale jak? – FaCoffee

+0

Ponadto, ponieważ 'mydf.index' zaczyna się od' 1', jak zrobić, aby zacząć od '0'? – FaCoffee

+1

@ CF84 to formatowanie ciągów znaków. Zrobiłem "supe_" i mogłem być wszystkim, co wybierzesz. '{}' jest tam z '.format (arkusz)', gdzie wartość w 'arkuszu' zostaje umieszczona tam, gdzie' {} 'znajdował się w ciągu znaków. Będziesz więc sprawdzał wartości '[0, 1, 2]' i ''super _ {}'. Format (arkusz)' oceni na ''super_0'''' super_1'' i '' super_2' '. Wymień go według własnego uznania. – piRSquared

Powiązane problemy