python - 计算具有缺失值的不同时间序列的最早和最后可用值的百分比变化
问题描述
我有不同国家的贫困值的时间序列(国家在行中,随时间变化的值在列中)。不幸的是,我有很多缺失的数据,但我想计算 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 | 钠 | 钠 | 钠 | 钠 |
解决方案
您可以过滤要处理的相关列.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
推荐阅读
- ionic-framework - 如何在离子中保存字符串资源
- python - SWIG - python 中的 C++ 代码
- sql - 为什么查询优化器选择完全不同的查询计划?
- .net - 构建包时如何限制版本?
- apache - Apache重定向到另一个端口
- polymer - Polymer 2.0 无法从 id 获取孩子
- office-js - 我是否需要 Office 365 来安装加载项
- android - ProGuard 找不到引用的类 android.net.http.AndroidHttpClient
- mysql - MariaDB 系统变量引用了哪些数据,例如 innodb_log_buffer_size
- sql - DateTime 格式和计算 SQL 查询中的秒数差异