Pandas:将数据框分割成同一个电子表格的多个工作表
Pandas: slicing a dataframe into multiple sheets of the same spreadsheet
假设我有 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 文件,其中 唯一 sheet:
>Sheet1<
d1 d2 d3
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
我的问题: 我怎样才能以生成的 Excel 文件有 3 个 sheets 的方式分割这个数据帧,在其中 headers 重复并且每个 sheet 中有两行值?
编辑
在此处给出的示例中,dict 各有 6 个元素。在我的真实情况下,他们有 25000,数据帧的索引从 1
开始。所以我想把这个数据帧分成 25 个不同的 sub-slices,每个都被转储到同一个主文件的专用 Excel sheet 中。
预期结果:一个 Excel 个文件,包含多个 sheet 个。 Headers 重复。
>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
首先准备你的数据框以便像这样编写:
prepdf = mydf.groupby(mydf.index // 2).apply(lambda df: df.reset_index(drop=True))
prepdf
您可以使用此功能来重置您的索引。
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'])
然后像这样将每个横截面写成不同的sheet:
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()
假设我有 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 文件,其中 唯一 sheet:
>Sheet1<
d1 d2 d3
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
我的问题: 我怎样才能以生成的 Excel 文件有 3 个 sheets 的方式分割这个数据帧,在其中 headers 重复并且每个 sheet 中有两行值?
编辑
在此处给出的示例中,dict 各有 6 个元素。在我的真实情况下,他们有 25000,数据帧的索引从 1
开始。所以我想把这个数据帧分成 25 个不同的 sub-slices,每个都被转储到同一个主文件的专用 Excel sheet 中。
预期结果:一个 Excel 个文件,包含多个 sheet 个。 Headers 重复。
>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
首先准备你的数据框以便像这样编写:
prepdf = mydf.groupby(mydf.index // 2).apply(lambda df: df.reset_index(drop=True))
prepdf
您可以使用此功能来重置您的索引。
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'])
然后像这样将每个横截面写成不同的sheet:
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()