【问题标题】:Pandas: cumsum in the past and in the future熊猫:过去和未来的cumsum
【发布时间】:2017-09-21 08:02:51
【问题描述】:

给定一个值,在时间上固定:

2010-06-01 : 100

以及该值在过去和未来发生的变化列表(相对于固定日期):

Date         Diff
2010-04-01   30
2010-05-01   20
2010-07-01   60
2010-08-01   10

我想要以下结果:

Date         Value
2010-04-01   50
2010-05-01   80
2010-06-01   100
2010-07-01   160
2010-08-01   170

基本上,固定日期之后的差异是累积相加的,固定日期之前的差异是累积减去的。

我目前的解决方案是:

  1. 将 diff DataFrame 过滤成两份:一份包含过去的值,一份包含未来的值。

  2. 否定过去的 DF,将其附加到当前 DF,降序排序,并进行 cumsum。

  3. 获取未来的 DF,将其附加到当前的 DF,升序排序,然后进行 cumsum。

  4. 将所有内容附加在一起。


一些入门代码:

pd.DataFrame({'Date': ['2010-04-01', '2010-05-01', '2010-07-01', '2010-08-01'], 'Diff': [30,20,60,10]})

pd.DataFrame({'Date': ['2010-06-01'], 'Value': [100]})

【问题讨论】:

    标签: python pandas cumsum


    【解决方案1】:

    您可以通过它们创建条件并应用功能:

    #convert to datetimes
    df1.Date = pd.to_datetime(df1.Date)
    df2.Date = pd.to_datetime(df2.Date)
    #join together
    df = (pd.concat([df1, df2.rename(columns={'Value':'Diff'})])
           .sort_values('Date')
           .reset_index(drop=True))
    print (df)
            Date  Diff
    0 2010-04-01    30
    1 2010-05-01    20
    2 2010-06-01   100
    3 2010-07-01    60
    4 2010-08-01    10
    
    m1 = df.Date < df2.loc[0, 'Date']
    m2 = ~m1
    #condition for select only appended value
    m3 = m2[[m2.idxmax()]]
    print (m3)
    2    True
    Name: Date, dtype: bool
    

    #multiple by -1 by condition m1
    df.loc[m1, 'Diff'] *= -1
    #chained m1 and m3 for inverse cumulative sum
    df.loc[m1 | m3, 'Diff'] = df.loc[m1 | m3, 'Diff'].iloc[::-1].cumsum()
    #classic cumsum
    df.loc[m2, 'Diff'] = df.loc[m2, 'Diff'].cumsum()
    print (df)
    
            Date  Diff
    0 2010-04-01    50
    1 2010-05-01    80
    2 2010-06-01   100
    3 2010-07-01   160
    4 2010-08-01   170
    

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2019-05-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2017-10-28
      相关资源
      最近更新 更多