【问题标题】:Setting cumulative values to constant after it reaches threshold and preserving first value在达到阈值后将累积值设置为常数并保留第一个值
【发布时间】:2018-07-12 09:04:04
【问题描述】:

我有一个包含每月累积值的 pandas 时间序列。

如果在某个日期的一个月内,该值小于某个数字,我保留第一个并将其余月份的所有内容设置为 1000。

例如

df:

 Date       cummulative_value
1/8/2017    -3
1/9/2017    -6
1/10/2017   -72
1/11/2017   500
1/26/2017   575
2/7/2017    -5
2/14/2017   -6
2/21/2017   -6

我的截止值是-71,所以在上面的例子中我需要实现以下目标:

 Date       cummulative_value
1/8/2017    -3
1/9/2017    -6
1/10/2017   -72
1/11/2017   1000
1/26/2017   1000
2/7/2017    -5
2/14/2017   -6
2/21/2017   -6

1/10/2017 -72 上的累积值低于 -71,因此我们保留它,但 2017 年 1 月剩余时间的每个值现在都设置为 1000。

当条件满足时,solution 将所有值设置为 1000。我需要保留第一个值。

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    这感觉有点hacky....我并不为此感到自豪。但它适用于您的数据集。

    df['cummulative_value'] = (df.groupby(df['Date'].dt.strftime('%Y%m'))['cummulative_value']
                                .transform(lambda x: np.where(x.ge(-71).cumprod()
                                .shift(1).fillna(1),x,1000)))
    

    输出:

            Date  cummulative_value
    0 2017-01-08                 -3
    1 2017-01-09                 -6
    2 2017-01-10                -72
    3 2017-01-11               1000
    4 2017-01-26               1000
    5 2017-02-07                 -5
    6 2017-02-14                 -6
    7 2017-02-21                 -6
    

    【讨论】:

    • 美丽.. 我喜欢阅读你的答案。我使用的是 for 循环,这是更聪明的方法
    猜你喜欢
    • 2018-07-12
    • 2021-04-10
    • 2021-05-22
    • 2020-03-30
    • 2021-03-26
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多