【问题标题】:Groupby and apply a functionGroupby并应用功能
【发布时间】:2019-03-19 17:28:27
【问题描述】:

我想按我的 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'

【问题讨论】:

    标签: python pandas group-by apply pandas-groupby


    【解决方案1】:

    这是一个麻烦但有效的解决方案:

    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
    

    【讨论】:

    • 它工作,使用: s = data.groupby('cod_id').apply(lookforward).T s= s.reset_index(drop=True) 但原始数据集非常慢
    • @AlessandroCeccarelli,是的,考虑到您的算法,这是预期的。你应该查一下resample
    • 问题在于聚合数据集
    • @AlessandroCeccarelli,嗯,我想不出更好的答案。这完全取决于您,但一个想法是提出一个只关注性能的新问题,展示一个有效的解决方案。然后你可能会得到更合适的回应。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2018-08-12
    • 2019-04-28
    • 2017-10-29
    • 2017-07-10
    • 2019-07-22
    相关资源
    最近更新 更多