2016-07-30 10 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枚のシートがあり、ヘッダーが繰り返され、各シートに2列の値がありますか?

EDIT

ここでdicts 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

'シート名を= 'super _ {}'。書式(シート) 'do?はい、それはシートの名前ですが、どうですか? – FaCoffee

+0

また、 'mydf.index'は' 1'から始まるので、どのように '0'から始めるのですか? – FaCoffee

+1

@ CF84これは文字列の書式設定です。私は '' supe_''を作って、あなたが選んだものになる可能性があります。そこの '{}'は '.format(sheet)'と一緒になり、 'sheet 'の値は' {} 'が文字列内にあったところに置かれます。したがって、あなたは '[0,1,2]'と '' super _ {} 'の値を繰り返し処理し、 '' super_0''、 '' super_1''、 '' super_2' '。あなたが合っているかのように交換してください。 – piRSquared

関連する問題