Pandas:将一个数据框分割成同一个电子表格的多张表

Posted

技术标签:

【中文标题】Pandas:将一个数据框分割成同一个电子表格的多张表【英文标题】:Pandas: slicing a dataframe into multiple sheets of the same spreadsheet 【发布时间】:2016-12-04 22:48:20 【问题描述】:

假设我有 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 张表格,其中标题重复,每个表格中有两行值床单?

编辑

在此处给出的示例中,每个字典都有 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

【问题讨论】:

【参考方案1】:

首先准备你的数据框,这样写:

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'])

然后将每个横截面写入不同的表格,如下所示:

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

【讨论】:

sheet_name = 'super_'.format(sheet) 是做什么的?是的,它为床单命名,但如何命名? @CF84 是字符串格式。我编了'supe_',可以是你选择的任何东西。那里的.format(sheet) 一起使用,其中sheet 中的值被放置在字符串中 的位置。因此,您将遍历值 [0, 1, 2]'super_'.format(sheet) 将评估为 'super_0''super_1''super_2'。根据需要替换它。 @CF84 我摆脱了您的索引,基本上从头开始创建了一个。我想要一个pd.MultiIndex,这样我就可以遍历第一级。我发现这是一种有用的方法。只要您以对您有用的方式将其分开,您如何做到这一点并不重要。 @CF84 不,您可以使用任何您喜欢的名称作为工作表名称。无论如何,玩这个。实验和学习。 @CF84 双倍真。

以上是关于Pandas:将一个数据框分割成同一个电子表格的多张表的主要内容,如果未能解决你的问题,请参考以下文章

Pandas - 将大型数据框切成块

Pandas 按唯一列值拆分数据框

如何将 pandas 数据框的数据类型更改为具有定义格式的字符串?

如何在 pandas/python 中查看 excel 电子表格的公式?

pandas数据分割pd.cut使用总结

如何将非结构化的 excel 电子表格加载到熊猫中?