Pandas 边走边向前填充并求和

问题描述 投票:0回答:3

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

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

希望也有帮助。我认为当前的解决方案会存在 nan 的问题。

python pandas date cumsum
3个回答
4
投票

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

cumsum

df.fillna(0).cumsum()

1
投票

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

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

编辑:您可能需要先将

Date
设置为索引。

df = df.set_index('Date')

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 方法说明:

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

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

一旦您了解了如何用一列来完成它,您应该能够将其推广到多个列。

© www.soinside.com 2019 - 2024. All rights reserved.