Сгруппировать и применить функцию - PullRequest
0 голосов
/ 15 октября 2018

Я бы хотел сгруппировать по переменной моего df "cod_id" и затем применить эту функцию:

[dd.loc[dd['dt_op'].between(d, d + pd.Timedelta(days = 7)), 'quantity'].sum() \
                        for d in data_1['dt_op']]

Переход от этого df:

print(dd)
dt_op      quantity      cod_id
20/01/18      1            613
21/01/18      8            611
21/01/18      1            613 
...

К этому:

print(final_dd)
n = 7

dt_op      quantity   product_code     Final_Quantity
20/01/18      1            613               2
21/01/18      8            611               8
25/01/18      1            613               1
...

Я пытался с:

dd.groupby(['cod_id']).apply([dd.loc[dd['dt_op'].between(d, d + pd.Timedelta(days = 7)), 'quantity'].sum() \
                            for d in data_1['dt_op']])

Но это повышает:

TypeError: unhashable type: 'list'

1 Ответ

0 голосов
/ 15 октября 2018

Это громоздкое, но рабочее решение:

def lookforward(x):
    L = [x.loc[x['dt_op'].between(row.dt_op, row.dt_op + pd.Timedelta(days=7)), \
         'quantity'].sum() for row in x.itertuples(index=False)]
    return pd.Series(L, index=x.index)

s = df.groupby('cod_id').apply(lookforward)
s.index = s.index.droplevel(0)

df['Final_Quantity'] = s

print(df)

       dt_op  quantity  cod_id  Final_Quantity
0 2018-01-20         1     613               2
1 2018-01-21         8     611               8
2 2018-01-21         1     613               1
...