Я довольно часто пишу функцию, которая возвращает разные кадры данных на основе параметров, которые я ввожу. Вот пример dataframe:
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='M'), 10000)})
Затем я создал функцию для выполнения промежуточных итогов для меня следующим образом:
def some_fun(DF1, agg_column, myList=[], *args):
y = pd.concat([
DF1.assign(**{x:'[Total]' for x in myList[i:]})\
.groupby(myList).agg(sumz = (agg_column,'sum')) for i in range(1,len(myList)+1)]).sort_index().unstack(0)
return y
Затем я выписываю списки, которые я передам в качестве аргументов. к функции:
list_one = [pd.Grouper(key='Date',freq='A'),'Category','Product']
list_two = [pd.Grouper(key='Date',freq='A'),'Category','Sub-Category','Sub-Category-2']
list_three = [pd.Grouper(key='Date',freq='A'),'Sub-Category','Product']
Затем я должен запустить каждый список через свою функцию, создавая новые кадры данных:
df1 = some_fun(df,'Units_Sold',list_one)
df2 = some_fun(df,'Dollars_Sold',list_two)
df3 = some_fun(df,'Units_Sold',list_three)
Затем я использую функцию, чтобы записать каждый из этих кадров данных в Excel Рабочий лист. Это всего лишь пример - я выполняю это упражнение более 10 раз.
Мой вопрос - есть ли лучший способ выполнить эту задачу, чем выписать df1, df2, df3 с примененной информацией о функциях? Должен ли я использовать словарь или другой тип данных, чтобы сделать это с помощью функции?