2016-07-30 27 views
5

Giả sử tôi có 3 từ điển có cùng độ dài, mà tôi kết hợp thành một dataframe pandas duy nhất. Sau đó, tôi đổ dataframe cho biết vào một tệp Excel. Ví dụ:Gấu trúc: cắt khung dữ liệu thành nhiều trang của cùng một bảng tính

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

Mã này tạo ra tập tin với một độc đáo tấm Excel:

>Sheet1< 

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

Câu hỏi của tôi: làm thế nào tôi có thể cắt dataframe này theo cách như vậy mà kết quả là các tập tin Excel có , nói, 3 trang tính, trong đó các tiêu đề được lặp lại và có hai hàng giá trị trong mỗi trang tính?

EDIT

Trong ví dụ đưa ra ở đây các dicts có 6 yếu tố từng. Trong trường hợp thực sự của tôi, chúng có 25000, chỉ số của khung dữ liệu bắt đầu từ 1. Vì vậy, tôi muốn cắt khung dữ liệu này thành 25 lát phụ khác nhau, mỗi lát được đổ vào một trang Excel chuyên dụng của cùng một tệp chính.

Kết quả dự định: một Tệp Excel với nhiều tờ. Tiêu đề được lặp lại.

>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 

Trả lời

3

chuẩn bị đầu tiên dataframe bạn vì đã viết như thế này:

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

enter image description here

Bạn có thể sử dụng chức năng này để thiết lập lại bạn chỉ số để thay thế.

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 

Sử dụng nó như thế này:

new_df = multiindex_me(mydf) 

Hoặc:

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

Sau đó viết mỗi mặt cắt ngang để một tờ khác nhau như thế này:

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

gì 'SHEET_NAME = 'super _ {}' định dạng (trang tính) 'làm gì? Có, nó đặt tên cho các tờ, nhưng làm thế nào? – FaCoffee

+0

Ngoài ra, vì 'mydf.index' bắt đầu từ' 1', bạn bắt đầu từ '0' như thế nào? – FaCoffee

+1

@ CF84 là định dạng chuỗi. Tôi đã tạo ra '' supe_'' và có thể là bất cứ thứ gì bạn chọn. '{}' trong đó đi với '.format (sheet)' trong đó giá trị trong 'sheet' được đặt trong đó' {} 'nằm trong chuỗi. Vì vậy, bạn sẽ lặp qua các giá trị '[0, 1, 2]' và ''super _ {}'. Định dạng (trang tính)' sẽ đánh giá thành ''super_0'','' super_1'' và ''super_2' '. Thay thế nó khi bạn thấy phù hợp. – piRSquared

Các vấn đề liên quan