在记录插值来自哪一年的同时,如何转发丢失的数据?

问题描述

我的数据如下:

country series YR1990 YR1991 ... YR2018 YR2019
RUS     A       xxx    xxx        xxx   NaN
CHN     A       xxx    NaN        NaN   NaN
RUS     B       xxx    xxx        xxx   xxx
CHN     B       xxx    xxx        xxx   xxx
.       .
.       .
.       .

我需要使用2018来填写2019的缺失值,如果没有2018数据则是2017,如果没有2017数据则是2016 ...一直到1990。我能够使用ffill

但是,当我用前几年的值替换该值时,我需要生成一个名为fill_year的新列来记录我过去一年中填写的缺失值。

最终,我想要一个这样的数据集:

country series YR2019 fill_year
RUS     A       xxx    2018
CHN     A       xxx    1990
RUS     B       xxx
CHN     B       xxx    
.       .
.       .
.       .

我尝试过这样的方法

for row in wb_long.iterrows():
        for yr in yr_list:
                if wb_long.loc[row,['YR2019']] == "NaN":
                        wb_long.loc[row,['YR2019']] = wb_long.loc[row,[yr]]
                        wb_long.loc[row,['YR2019']] = yr

但是我得到了Series objects are mutable and cannot be hashed

解决方法

从生成辅助DataFrame开始:

rows = []
for idx,row in df.iterrows():
    fill_year = row.last_valid_index()
    last_val = row[fill_year]
    rows.append([last_val,'' if fill_year == 'YR2019' else fill_year])
df2 = pd.DataFrame(rows,columns=['YR2019','fill_value'])

然后用 df2 中的相应列覆盖 YR2019 列, 添加 fill_value 列:

df.YR2019 = df.YR2019.combine_first(df2.YR2019)
df['fill_value'] = df2.fill_value

为了测试上面的代码,我对您的数据样本做了些改动

  country series YR1990 YR1991 YR2018 YR2019
0     RUS      A    x01    x02    x03    NaN
1     CHN      A    x04    NaN    NaN    NaN
2     RUS      B    x05    x06    x07    x08
3     CHN      B    x09    x10    x11    x12

并得到以下结果:

  country series YR1990 YR1991 YR2018 YR2019 fill_value
0     RUS      A    x01    x02    x03    x03     YR2018
1     CHN      A    x04    NaN    NaN    x04     YR1990
2     RUS      B    x05    x06    x07    x08           
3     CHN      B    x09    x10    x11    x12