Python Pandas: fillna / bfill using function



我从库存管理系统中检索了几个项目的库存变动:

index   itemid    date      sold    received    balance  stock_level
0       123456    30.03.18  -1      0           -1       3
1       123456    04.04.18  -1      0           -1       2
2       123456    09.04.18   0      1            1       3
3       123457    01.04.18   0      1            1       3
4       123457    03.04.18  -1      0           -1       2
5       123457    11.04.18   0      1            1       3

为了执行正确的分析,我创建了一个连续的日期序列

index   itemid    date    sold  received   balance  stock_level
0       123456    28.03.18  0   0           0       nan
1       123456    29.03.18  0   0           0       nan
2       123456    30.03.18  -1  0           -1      3
3       123456    31.03.18  0   0           0       nan
4       123456    01.04.18  0   0           0       nan
5       123456    02.04.18  0   0           0       nan
6       123456    03.04.18  0   0           0       nan
7       123456    04.04.18  -1  0           -1      2
8       123456    05.04.18  0   0           0       nan
9       123456    06.04.18  0   0           0       nan
10      123456    07.04.18  0   0           0       nan
11      123456    08.04.18  0   0           0       nan
12      123456    09.04.18  0   1           1       3
13      123456    10.04.18  0   0           0       nan
14      123456    11.04.18  0   0           0       nan
15      123457    28.03.18  0   0           0       nan
16      123457    29.03.18  0   0           0       nan
17      123457    30.03.18  0   0           0       nan
18      123457    31.03.18  0   0           0       nan
19      123457    01.04.18  0   1           1       3
20      123457    02.04.18  0   0           0       nan
21      123457    03.04.18  -1  0           -1      2
22      123457    04.04.18  0   0           0       nan
23      123457    05.04.18  0   0           0       nan
[...]
28      123457    11.04.18  0   1           1       3

现在,我需要在股票列中为每个项目填充 nan 值 groupby(itemid) .我可以为每个组使用 ffill 来填充第 3 行的值,但需要根据(第一个非 nan 股票价值(-(该指数的余额值(的函数为每个组填充。

例如,索引 0 的填充应为 (stock_level 在索引 2 处( - (余额在索引 2 处(。

也就是说,我正在寻找的结果是

index   itemid    date    sold  received   balance  stock_level
0       123456    28.03.18  0   0           0       4
1       123456    29.03.18  0   0           0       4
2       123456    30.03.18  -1  0           -1      3
3       123456    31.03.18  0   0           0       3
4       123456    01.04.18  0   0           0       3
5       123456    02.04.18  0   0           0       3
6       123456    03.04.18  0   0           0       3
7       123456    04.04.18  -1  0           -1      2
8       123456    05.04.18  0   0           0       2
9       123456    06.04.18  0   0           0       2
10      123456    07.04.18  0   0           0       2
11      123456    08.04.18  0   0           0       2
12      123456    09.04.18  0   1           1       3
13      123456    10.04.18  0   0           0       3
14      123456    11.04.18  0   0           0       3
15      123457    28.03.18  0   0           0       2
16      123457    29.03.18  0   0           0       2
17      123457    30.03.18  0   0           0       2
18      123457    31.03.18  0   0           0       2
19      123457    01.04.18  0   1           1       3
20      123457    02.04.18  0   0           0       3
21      123457    03.04.18  -1  0           -1      2
22      123457    04.04.18  0   0           0       2
23      123457    05.04.18  0   0           0       2
[...]
28      123457    11.04.18  0   1           1       3

如何根据第一个非 nan 值索引处的函数回填每个项目组?

ffill之后,唯一剩下的 NaN 是开始时的那些。
您需要在此处使用pd.Series.first_valid_index,以及 ffillfillna 的组合。

i = df.stock_level.first_valid_index()
df.stock_level.ffill().fillna(df.stock_level[i] - df.balance[i])
0     4.0
1     4.0
2     3.0
3     3.0
4     3.0
5     3.0
6     3.0
7     2.0
8     2.0
9     2.0
10    2.0
11    2.0
12    3.0
13    3.0
14    3.0
Name: stock_level, dtype: float64

最新更新