我有一个稀疏的数据框,包括购买或出售库存的日期,如下所示:
Date Inventory
2017-01-01 10
2017-01-05 -5
2017-01-07 15
2017-01-09 -20
我想解决的第一步是在其他日期添加。我知道您可以使用重新采样,但只是突出显示该部分,以防它对下一个更困难的部分产生影响。如下:
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
我正在试图采用pythonic方法,而不是基于循环的方法,因为这将非常慢。
该示例还适用于具有多列的表:
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产生问题。
感谢
答案 0 :(得分:2)
您可以在重新采样后填充缺失值0(当天没有库存更改),然后使用cumsum
df.fillna(0).cumsum()
答案 1 :(得分:1)
您只是按照错误的顺序执行这两个步骤:)
df['Inventory'].cumsum().resample('D').pad()
修改:您可能需要先将Date
设为索引。
df = df.set_index('Date')
答案 2 :(得分:0)
第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
第2部分
来自fillna方法说明:
方法:{'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
一旦您了解了如何使用一列,您应该可以将其概括为多个列。