首页 > 解决方案 > 计算具有缺失值的不同时间序列的最早和最后可用值的百分比变化

问题描述

我有不同国家的贫困值的时间序列(国家在行中,随时间变化的值在列中)。不幸的是,我有很多缺失的数据,但我想计算 Python 中每个国家/地区的最后可用年份和最早可用年份之间的百分比变化。因此,对于下面的 ZWE,这将是 2019 年和 2011 年之间的 pct 变化,而对于 ZWB,则需要 2015 年和 2010 年。有没有办法自动化这个?也许使用 iterrows?

任何帮助将非常感激。谢谢!

2010年 2011年 2012年 2013年 2014年 2015年 2016年 2017年 2018年 2019年
ZWE 22.5 30.4 38.3
中巴 54.7 54.4

标签: pythonpandas

解决方案


您可以过滤要处理的相关列.filter(),然后对于每个国家/地区(每一行),删除NaN条目.dropna(),然后将最后一个(非 NaN)条目除以第一个(非 NaN)条目,减去 1 并乘以100 得到百分比:

df['% change'] = df.filter(regex=r'YR\d+').apply(lambda x: 0 if len((z:=x.dropna())) == 0 else (z.iloc[-1]/z.iloc[0] -1) * 100, axis=1)

或者,如果您的 Python 版本早于 Python 3.8 并且不支持赋值运算符:=,请使用:

df['% change'] = df.filter(regex=r'YR\d+').apply(lambda x: 0 if len(x.dropna()) == 0 else (x.dropna().iloc[-1]/x.dropna().iloc[0] -1) * 100, axis=1)

结果:

print(df)

   iso  YR2010  YR2011  YR2012  YR2013  YR2014  YR2015  YR2016  YR2017  YR2018  YR2019   % change
0  ZWE     NaN    22.5     NaN     NaN     NaN     NaN     NaN    30.4     NaN    38.3  70.222222
1  ZMB    54.7     NaN     NaN     NaN     NaN    54.4     NaN     NaN     NaN     NaN  -0.548446

推荐阅读