首页 > 解决方案 > 遍历多索引

问题描述

我有一个基于这些数据的数据框:

np.random.seed(1111)
df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B'], 10000),
'Sub-Category':np.random.choice( ['X','Y','Z'], 10000),
'Sub-Category-2':np.random.choice( ['G','F','I'], 10000),
'Product':np.random.choice( ['Product 1','Product 2','Product 3'], 10000),
'Units_Sold':np.random.randint(1,100, size=(10000)),
'Dollars_Sold':np.random.randint(100,1000, size=10000),
'Customer':np.random.choice(pd.util.testing.rands_array(10,25,dtype='str'),10000),
'Date':np.random.choice( pd.date_range('1/1/2016','12/31/2018',  
                      freq='D'), 10000)})

然后我创建一个 groupby 来格式化我想要的数据:

sales = df.groupby([df.Date.dt.month,'Customer','Product'])['Units_Sold','Dollars_Sold'].sum()

我想遍历这个 groupby 以将每个“客户”写入它自己的 Excel 工作簿,并将文件保存为“客户”.xlsx。在每个客户的每个工作簿中,我想让每个“日期”(又名月份)写入它自己的工作表。

这是我当前用于将每个客户写入其自己的工作表的循环示例:

idx = pd.IndexSlice
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
for c in sales.index.get_level_values(1).unique():
    sales.loc[idx[:,c,:],idx[:]]\
    .to_excel(writer, sheet_name=c)
writer.save()

我找到了一种将每个都写入工作簿中自己的工作表的方法,但似乎无法将它们放在一起。谢谢你的帮助!

标签: pythonpandas

解决方案


这对我有用。我基本上重置了销售 groupby 对象的索引以获取常规数据框。从客户列中获取唯一的客户列表。遍历客户列表,为每个客户制作一个数据框。

按日期分组,然后使用 d、s 迭代 groupby 对象,其中 d = 日期,s = 销售额。

使用字符串格式输入客户 ID 作为工作簿名称,并使用 str(d) 作为工作表名称。使用 pandas to_excel 在工作簿中编写工作表,并在循环的每次迭代结束时保存完成的工作簿。

import pandas as pd
import numpy as np

np.random.seed(1111)
df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B'], 10000),
'Sub-Category':np.random.choice( ['X','Y','Z'], 10000),
'Sub-Category-2':np.random.choice( ['G','F','I'], 10000),
'Product':np.random.choice( ['Product 1','Product 2','Product 3'], 10000),
'Units_Sold':np.random.randint(1,100, size=(10000)),
'Dollars_Sold':np.random.randint(100,1000, size=10000),
'Customer':np.random.choice(pd.util.testing.rands_array(10,25,dtype='str'),10000),
'Date':np.random.choice( pd.date_range('1/1/2016','12/31/2018',  
                      freq='D'), 10000)})

sales = df.groupby([df.Date.dt.month,'Customer','Product'])['Units_Sold','Dollars_Sold'].sum().reset_index()

customers = sales['Customer'].unique()

for customer in customers:
    writer = pd.ExcelWriter('{}.xlsx'.format(customer), engine='xlsxwriter')
    temp = sales[sales['Customer'] == customer]
    temp = temp.drop(columns='Customer')
    temp = temp.groupby('Date')
    for d, s in temp:
        s.to_excel(writer, sheet_name=str(d), index=False)
    writer.save()

推荐阅读