采用以下测试数据框:
test_df = pd.DataFrame({'col_a' : [np.nan, np.nan, 4.0, 5.0, 12.0, 45.0, 86.0, 92.0, np.nan, np.nan, np.nan]})
test_df
col_a
0 NaN
1 NaN
2 4.0
3 5.0
4 12.0
5 45.0
6 86.0
7 92.0
8 NaN
9 NaN
10 NaN
现在我希望将col_a
中的所有NA填充到第一个数据点(4.0),值为0.0。
我还想将最新数据点(92.0)中的所有NA替换为值100.0。
fillna方法的关键字value
和method
的组合似乎不像我原先希望的那样有效。
++++++++
修改
实际上,我可以从数据框的顶部开始填写如下:
test_df.loc[0:test_df['col_a'].first_valid_index()] = test_df.loc[0:test_df['col_a'].first_valid_index()].fillna(value=0)
然后使用fillna
方法替换剩下的NAs,但是对于无数列和其他数据帧约束来说,它非常难以处理。
++++++++
答案 0 :(得分:2)
按照由cumsum
创建的最大cumsum
创建的帮助系列分配值,然后按min
和max
进行比较创建掩码,但必须使用最大值{{ 3}}用于省略最后一个非NaN
值:
a = test_df['col_a'].notnull().cumsum()
print (a)
0 0
1 0
2 1
3 2
4 3
5 4
6 5
7 6
8 6
9 6
10 6
Name: col_a, dtype: int32
test_df[a == a.min()] = 0
test_df[a.shift() == a.max()] = 100
print (test_df)
col_a
0 0.0
1 0.0
2 4.0
3 5.0
4 12.0
5 45.0
6 86.0
7 92.0
8 100.0
9 100.0
10 100.0