【问题标题】:Python Pandas: Doing cumsum for each day for monthsPython Pandas:几个月来每天都做 cumsum
【发布时间】:2017-03-01 02:35:38
【问题描述】:

我有一个如下的数据框

Storeid      Year-Month     Date        Amount
 111           01-2016    2016-01-29      10
 111           01-2016    2016-01-30      15
 111           02-2016    2016-02-03      20
 111           02-2016    2016-02-10      17
 111           02-2016    2016-02-15      18
 111           03-2016    2016-03-02      12
 112           01-2016    2016-01-25      14
 112           01-2016    2016-01-29      12
 ...

我想要的输出是这个

Storeid      Year-Month     Date        Amount
 111           01-2016    2016-01-29      10
 111           01-2016    2016-01-30      25
 111           02-2016    2016-02-03      20
 111           02-2016    2016-02-10      37
 111           02-2016    2016-02-15      55
 111           03-2016    2016-03-02      12
 112           01-2016    2016-01-25      14
 112           01-2016    2016-01-29      26
 ...

该值在每个月后重置,并再次从 0 开始。我尝试从 pandas 执行 cumsum 函数,但它尝试在整个数据帧中执行此操作。我如何限制它每月执行一次?

目标是找到“给定日期,哪家商店在该日期达到了当月的销售目标”。销售目标是 $1000

【问题讨论】:

    标签: python pandas dataframe cumsum


    【解决方案1】:

    你可以groupby.cumsum:

    df['AmountToDate'] = df.groupby(['Storeid', 'Year-Month']).Amount.cumsum()
    df
    

    更新:要提取对应的行,你可以使用groupby.apply(...cumsum..),它可以让你做更多的自定义操作:

    (df.groupby(['Storeid', 'Year-Month'], as_index=False, group_keys=False)
     .apply(lambda g: g.assign(Amount = g.Amount.cumsum())[lambda x: x.Amount >= 25].head(1)))
    

    这是如何工作的?

    • groupby.apply 表示apply 方法中的lambda 表达式分别应用于每个组(这里是Storeid 和Year-Month 的唯一组合);
    • 传递给lambda表达式的参数g是一个唯一storeid + Year-Month(组变量)的子数据帧,对每个数据帧计算Amountcumsum,过滤掉cumsum >= target的行,取第一行是head(1)

    【讨论】:

    • 谢谢@psidom。这行得通。但是,如何过滤达到目标的日期?例如,在上面的例子中,如果我的目标是 >=25,我只想要第 1 行、第 3 行、第 7 行。
    • 刚刚更新了一种提取相应行的方法。
    • 这非常有效。谢谢你。我还在学习熊猫。您介意在答案中添加更多关于自定义脚本如何工作的描述吗?
    • 太棒了。感谢您的编辑。最后一个问题。根据pandas.pydata.org/pandas-docs/stable/generated/… ,它说group_keys 在使用apply 时应该是True。我们将其命名为False。我理解正确吗?
    • 是的,默认值为 True,这会在结果中添加额外的列。我将其设置为 False 以保持结果干净,但它只是一个参数,您可以根据您想要的结果进行调整。
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    相关资源
    最近更新 更多