Запись нескольких динамических фреймов данных в книгу Excel - PullRequest
0 голосов
/ 16 мая 2019

Я ищу помощь в фильтрации различных фреймов данных для экспорта в рабочие таблицы. Вот примерный фрейм данных.

import pandas as pd
import numpy as np

np.random.seed(1111)
df = pd.DataFrame({
'Category':np.random.choice( ['Group A','Group B','Group C','Group D'], 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)})

Ниже приведены различные кадры данных, которые я хотел бы экспортировать в книги Excel:

df1 = df.groupby(['Category','Sub-Category-2','Product']).agg({'Units_Sold':'sum'})
df2 = df.groupby(['Category','Product',pd.Grouper(key='Date',freq='A-APR')]).agg({'Dollars_Sold':'sum'})
df3 = df.groupby(['Category','Product','Sub-Category']).agg({'Units_Sold':'sum','Dollars_Sold':'sum'})

Для каждой категории я хотел бы создать отдельную книгу Excel с отфильтрованным каждым кадром данных, чтобы показать только эту конкретную категорию. Например, рабочая книга «Группа A» будет иметь в качестве отдельных рабочих листов df1, df2 и & df3, причем в кадре данных отображаются только те значения, где «Category» = «Группа A». Рабочая книга «Группа B» будет иметь ту же информацию, только что отфильтрованная, где «Категория» = «Группа B».

Я знаю, как сделать это вручную с помощью .loc, но это кажется очень медленным. У меня вопрос, как мне сделать это питонским способом? Данные в примере не велики, но мои реальные данные содержат более 30 категорий в категории. Есть ли способ создать функцию для надлежащего нарезки и удаления данных после фильтрации?

1 Ответ

0 голосов
/ 16 мая 2019

Как насчет просто запустить

for c in df.Category.unique():
    with pd.ExcelWriter(f"/Users/constantino/Desktop/{c}.xlsx") as writer:
        for i, d in enumerate([df1, df2, df3]):
            d.loc[c].to_excel(writer, sheet_name=f"df{i+1}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...