我从库存管理系统中检索了几件商品的库存变动:
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
现在,我需要在每个项groupby(itemid)
的库存列中填充nan值。我可以使用ffill为每个组填充第3行的值,但需要根据(第一个非南股票价值)的函数为每个组填充 - (该指数的余额值)。
E.g。索引0的bfill应该是(stock_level at index 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
如何根据第一个非纳米值的索引处的函数回填每个项目组?
答案 0 :(得分:2)
在ffill
之后,剩下的唯一NaN就是那些开始时的NaN
您需要在此使用pd.Series.first_valid_index
,以及ffill
和fillna
的组合。
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