Python Pandas:fillna / bfill使用函数

时间:2018-04-20 11:09:57

标签: python pandas data-munging fillna

我从库存管理系统中检索了几件商品的库存变动:

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

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

1 个答案:

答案 0 :(得分:2)

ffill之后,剩下的唯一NaN就是那些开始时的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