【问题标题】:Pandas Grouper "Cumulative" sum()熊猫石斑鱼“累积” sum()
【发布时间】:2021-05-18 14:48:03
【问题描述】:

我正在尝试计算接下来 4 周的累计总数。

这是我的数据框的示例

d = {'account': [10, 10, 10, 10, 10, 10, 10, 10],
     'volume': [25, 60, 40, 100, 50, 100, 40, 50]}
df = pd.DataFrame(d)
df['week_starting'] = pd.date_range('05/02/2021',
                                    periods=8,
                                    freq='W')
df['volume_next_4_weeks'] = [225, 250, 290, 290, 240, 190, 90, 50]
df['volume_next_4_weeks_cumulative'] = ['(25+60+40+100)', '(60+40+100+50)', '(40+100+50+100)', '(100+50+100+40)', '(50+100+40+50)', '(100+40+50)', '(40+50)', '(50)']
df.head(10)

dataframe_table_view

我会想办法通过pd.Grouper freq = 4W来计算累积量。

【问题讨论】:

    标签: python pandas numpy pandas-groupby cumsum


    【解决方案1】:

    这应该可行:

    df['volume_next_4_weeks']  = [sum(df['volume'][i:i+4]) for i in range(len(df))]
    

    对于将添加显示为string 的另一列,我已使用与上述相同的逻辑将值存储在列表中,但未应用 sum,然后将列表元素连接为 string

    df['volume_next_4_weeks_cumulative'] = [df['volume'][i:i+4].to_list() for i in range(len(df))]
    df['volume_next_4_weeks_cumulative'] = df['volume_next_4_weeks_cumulative'].apply(lambda row: ' + '.join(str(x) for x in row))
    

    现在正如您所提到的,您有不同的多个帐户,并且您想为所有帐户单独执行此操作,创建一个自定义函数,然后使用 groupbyapply 创建列:

    def create_mov_cols(df):
        df['volume_next_4_weeks']  = [sum(df['volume'][i:i+4]) for i in range(len(df))]
        df['volume_next_4_weeks_cumulative'] = [df['volume'][i:i+4].to_list() for i in range(len(df))]
        df['volume_next_4_weeks_cumulative'] = df['volume_next_4_weeks_cumulative'].apply(lambda row: ' + '.join(str(x) for x in row))
        return df
    

    将函数应用到 DataFrame:

    df = df.groupby(['account']).apply(create_mov_cols)
    

    【讨论】:

    • Shivan Roy 有效。非常感谢你。如何按帐户分组?以我为例,我只有一个帐户,但在实际问题中,我确实有更多帐户具有相同的 week_starting
    • 您可以使用我在回答中提到的代码创建自定义函数,然后使用groupby(['account']).apply(custom_func) 获得所需的结果。请检查编辑,我已经为您完成了。
    • 非常感谢 Shivan Roy。它工作得很好。我想知道在哪里可以找到更多关于这些功能的课程。
    • @KleitonMarquesDosReis 很高兴它对您有所帮助。有很多来源,pandas 文档是一个很好的来源,除了 YouTube 上有几个很好的免费频道,你可以搜索:youtube.com/watch?v=Wb2Tp35dZ-Iyoutube.com/watch?v=txMdrV1Ut64。这是两个视频,您也可以探索他们的频道。谢谢:)
    【解决方案2】:
    df['volume_next_4_weeks'] = df[['week_starting', 'volume']][::-1].rolling(window='28D', on='week_starting').sum()[::-1]['volume']
    

    使用28D 代替4W,因为后者不是固定频率。

    【讨论】:

    • im0j 它也工作得很好。如上所述,如何按帐户分组?
    猜你喜欢
    • 1970-01-01
    • 2017-11-15
    • 2020-01-05
    • 2018-06-25
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2019-07-26
    相关资源
    最近更新 更多