Pandas 用最后一个已知值填充空的尾随值

dio*_*nes 1 pandas

我有几个具有不同结束时间段的列。

需要用最后一个已知值填充空数据。

有没有一种 Pandas 方法可以在不循环结束日期的情况下做到这一点?

在过去的 4 个月中,我需要 Gain_sum_y 等于 -57129.0。

        gain_sum_x  gain_sum_y
month                             
2014-09-30      -97747    -41355.0
2014-10-31     -112928    -47394.0
2014-11-30     -131638    -57129.0
2014-12-31     -161370         0.0
2015-01-31     -168832         0.0
2015-02-28     -151930         0.0
2015-03-31     -162077         0.0
Run Code Online (Sandbox Code Playgroud)

谢谢。

jez*_*ael 6

我认为你需要replacewith ffill( fillnawith method='ffill') 如果想用0最后一个非0值替换所有值:

df = df.replace(0, np.nan).ffill()
print (df)
        month  gain_sum_x  gain_sum_y
0  2014-09-30      -97747    -41355.0
1  2014-10-31     -112928    -47394.0
2  2014-11-30     -131638    -57129.0
3  2014-12-31     -161370    -57129.0
4  2015-01-31     -168832    -57129.0
5  2015-02-28     -151930    -57129.0
6  2015-03-31     -162077    -57129.0
Run Code Online (Sandbox Code Playgroud)

如果您想指定替换列(谢谢John Galt):

df.replace({'gain_sum_y': {0: np.nan}}).ffill()
Run Code Online (Sandbox Code Playgroud)

多个样本0:

print (df)
            gain_sum_x  gain_sum_y
month                             
2014-09-30      -97747    -41355.0
2014-10-31           0         0.0
2014-11-30           0    -57129.0
2014-12-31     -161370         0.0
2015-01-31     -168832         0.0
2015-02-28           0         0.0
2015-03-31     -162077         0.0

df1 = df.replace(0,np.nan).ffill()
print (df1)
            gain_sum_x  gain_sum_y
month                             
2014-09-30    -97747.0    -41355.0
2014-10-31    -97747.0    -41355.0
2014-11-30    -97747.0    -57129.0
2014-12-31   -161370.0    -57129.0
2015-01-31   -168832.0    -57129.0
2015-02-28   -168832.0    -57129.0
2015-03-31   -162077.0    -57129.0
Run Code Online (Sandbox Code Playgroud)

但是如果只需要替换 last0需要last_valid_index替换 last 0to NaN:

df2 = df.replace(0,np.nan).apply(lambda x: x.loc[:x.last_valid_index()].fillna(0)).ffill()
print (df2)
            gain_sum_x  gain_sum_y
2014-09-30    -97747.0    -41355.0
2014-10-31         0.0         0.0
2014-11-30         0.0    -57129.0
2014-12-31   -161370.0    -57129.0
2015-01-31   -168832.0    -57129.0
2015-02-28         0.0    -57129.0
2015-03-31   -162077.0    -57129.0
Run Code Online (Sandbox Code Playgroud)