Python Pandas: fillna / bfill 使用函数
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 股票值)-(该索引处的余额值)的函数对每个组进行 bfill。
例如索引 0 的 bfill 应该是 (stock_level at index 2) - (balance at index 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
,以及 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
我已经从库存管理系统中检索到多个项目的库存变动:
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 股票值)-(该索引处的余额值)的函数对每个组进行 bfill。
例如索引 0 的 bfill 应该是 (stock_level at index 2) - (balance at index 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
,以及 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