微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我的数据如下:

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           

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。