遍历Multiindex

时间:2018-12-28 16:31:29

标签: python pandas

我有一个基于此数据的数据框:

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工作簿,并将文件另存为“ Customer” .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()

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

1 个答案:

答案 0 :(得分:1)

这对我有用。我实质上是重置sales groupby对象上的索引以获取常规数据框。从客户列中获取唯一的客户列表。遍历客户列表,为每个客户创建一个数据框。

按日期对该分组进行分组,然后使用d,s(其中d =日期和s =销售)遍历groupby对象。

使用字符串格式输入客户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()