将pandas DataFrame填充到第一个数据点,并从给定值的最后一个数据点填充

时间:2018-02-06 10:15:50

标签: python pandas dataframe

采用以下测试数据框:

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方法的关键字valuemethod的组合似乎不像我原先希望的那样有效。

你能帮忙吗? pythonic越多越好。谢谢。

++++++++

修改

实际上,我可以从数据框的顶部开始填写如下:

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,但是对于无数列和其他数据帧约束来说,它非常难以处理。

++++++++

1 个答案:

答案 0 :(得分:2)

按照由cumsum创建的最大cumsum创建的帮助系列分配值,然后按minmax进行比较创建掩码,但必须使用最大值{{ 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