问题描述
我的数据如下:
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