【问题标题】:Pandas fill forward and sum as you go熊猫向前填充并随你而去
【发布时间】:2017-09-01 08:41:56
【问题描述】:

我有一个稀疏的数据框,包括购买或出售库存的日期,如下所示:

Date         Inventory
2017-01-01       10 
2017-01-05       -5
2017-01-07       15
2017-01-09      -20

我想解决的第一步是添加其他日期。我知道你可以使用 resample 但只是突出显示这部分以防它对下一个更困难的部分产生影响。如下:

Date         Inventory
2017-01-01       10
2017-01-02       NaN
2017-01-03       NaN
2017-01-04       NaN
2017-01-05       -5
2017-01-06       NaN
2017-01-07       15
2017-01-08       NaN
2017-01-09      -20

最后一步是让它在 NaN 上向前填充,除非它遇到一个新值,该值被添加到上面行的当前值中,因此最终数据帧如下所示:

Date         Inventory
2017-01-01       10
2017-01-02       10
2017-01-03       10
2017-01-04       10
2017-01-05       5
2017-01-06       5
2017-01-07       20
2017-01-08       20
2017-01-09       0
2017-01-10       0

我正在尝试使用 Python 的方法来解决这个问题,而不是基于循环的方法,因为那样会很慢。

该示例也应该适用于具有多个列的表,例如:

Date         InventoryA       InventoryB
2017-01-01       10              NaN
2017-01-02       NaN             NaN
2017-01-03       NaN              5
2017-01-04       NaN              5
2017-01-05       -5              NaN
2017-01-06       NaN             -10
2017-01-07       15              NaN
2017-01-08       NaN             NaN
2017-01-09      -20              NaN

会变成:

Date         InventoryA     InventoryB
2017-01-01       10             0
2017-01-02       10             0
2017-01-03       10             5
2017-01-04       10            10
2017-01-05       5             10
2017-01-06       5              0
2017-01-07       20             0
2017-01-08       20             0
2017-01-09       0              0
2017-01-10       0              0

希望这也有帮助。我认为当前的解决方案将与 nans 本身存在问题。

谢谢

【问题讨论】:

  • 我的解决方案有效吗?
  • 在该示例中是的,但如果有多个列具有不同的日期和不同的空白,则不是这样。
  • 嗯不是真的 :) 我需要另一个例子。

标签: python pandas date cumsum


【解决方案1】:

你可以在重采样后将缺失值填0(当天没有库存变化),然后使用cumsum

df.fillna(0).cumsum()

【讨论】:

    【解决方案2】:

    您只是按错误的顺序执行了这两个步骤:)

    df['Inventory'].cumsum().resample('D').pad()
    

    编辑:您可能需要先将Date 设置为索引。

    df = df.set_index('Date')
    

    【讨论】:

      【解决方案3】:

      第 1 部分:假设 df 是你的

      Date         Inventory
      2017-01-01       10 
      2017-01-05       -5
      2017-01-07       15
      2017-01-09      -20
      

      然后

      import pandas as pd
      import datetime
      
      df_new = pd.DataFrame([df.Date.min() + datetime.timedelta(days=day) for day in range((df.Date.max() - df.Date.min()).days+1)])
      df_new = df_new.merge(df, left_on=0, right_on='Date',how="left").drop("Date",axis=1)
      df_new.columns = df.columns
      

      给你:

          Date    Inventory
      0   2017-01-01  10.0
      1   2017-01-02  NaN
      2   2017-01-03  NaN
      3   2017-01-04  NaN
      4   2017-01-05  -5.0
      5   2017-01-06  NaN
      6   2017-01-07  15.0
      7   2017-01-08  NaN
      8   2017-01-09  -20.0
      

      第二部分

      来自fillna的方法说明:

      method : {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None},默认无 用于填充重新索引系列垫/填充孔的方法: 将最后一个有效观察值向前传播到下一个有效回填 / bfill:使用 NEXT 有效观察来填补空白

      df_new.Inventory = df_new.Inventory.fillna(method="ffill")
      

      给你

          Date    Inventory
      0   2017-01-01  10.0
      1   2017-01-02  10.0
      2   2017-01-03  10.0
      3   2017-01-04  10.0
      4   2017-01-05  -5.0
      5   2017-01-06  -5.0
      6   2017-01-07  15.0
      7   2017-01-08  15.0
      8   2017-01-09  -20.0
      

      一旦你理解了如何用一列来完成它,你应该能够将它推广到不止一列。

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 2019-03-14
        • 2022-10-13
        • 1970-01-01
        • 2019-07-12
        • 2020-03-09
        相关资源
        最近更新 更多