Pandas使用上一个已知值填充空尾随值

时间:2017-09-06 06:51:19

标签: 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

感谢。

4 个答案:

答案 0 :(得分:3)

如果您希望将所有ffill值替换为最后一个非method='ffill'值,我认为您需要replace 0 fillna 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

如果要指定要替换的列(谢谢John Galt):

df.replace({'gain_sum_y': {0: np.nan}}).ffill()

多个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

但是如果需要仅替换最后0需要last_valid_index,则将0替换为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

答案 1 :(得分:1)

试试这个:

df.fillna(method='pad')

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

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

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

我需要过去 4 个月的 gain_sum_y 等于 -57129.0。

月 | gain_sum_x | gain_sum_y -|-|- 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 谢谢。

答案 2 :(得分:0)

import pandas as pd
import datetime

df = pd.read_csv("data.txt")
df['month'] = pd.to_datetime(df['month'])
mask = df['month'] > datetime.datetime.strptime("2014-12-01",'%Y-%m-%d')
df['gain_sum_y'][mask] = -57129.0 
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

答案 3 :(得分:0)

以下是我的工作:

# loop through all the columns
for i, column in enumerate ( df.columns ):

    # find the last row with value not zero
    x = df [ df[column] != 0 ].index [ -1 ]
    # get the last value before the zero values
    y = df[column] [x]
    # find and fill the rows greater than date "x" with value "y"
    mask = (df.index > x)
    df[column] [ mask ] = y

我希望这是好熊猫。感谢所有人。