pandas - Pandas 柱回填减少/增加
问题描述
我有数据框
| ind | A | B |
------------------------
| 1.01 | 10 | -1.734 |
| 1.04 | 10 | -1.244 |
| 1.05 | 10 | 0.016 |
| 1.11 | NaN | -2.737 | <-
| 1.13 | NaN | -4.232 | <-
| 1.19 | 11 | -3.241 | <=
| 1.20 | 12 | -2.832 |
| 1.21 | 10 | -4.277 |
并希望使用以下一个有效值结尾的递减序列回填 NaN 值
| ind | A | B |
------------------------
| 1.01 | 10 | -1.734 |
| 1.04 | 10 | -1.244 |
| 1.05 | 10 | 0.016 |
| 1.11 | 13 | -2.737 | <-
| 1.13 | 12 | -4.232 | <-
| 1.19 | 11 | -3.241 | <=
| 1.20 | 12 | -2.832 |
| 1.21 | 10 | -4.277 |
有没有办法做到这一点?
解决方案
获取找到 NaN 的位置
positions = df['A'].isna().astype(int)
| positions |
--------------
| 0 |
| 0 |
| 0 |
| 1 |
| 1 |
| 0 |
| 0 |
| 0 |
然后做反向累积和:
mask = df['A'].isna().astype(int).loc[::-1]
cumSum = mask.cumsum()
posCumSum = (cumSum - cumSum.where(~mask).ffill().fillna(0).astype(int)).loc[::-1]
| posCumSum |
--------------
| 0 |
| 0 |
| 0 |
| 2 |
| 1 |
| 0 |
| 0 |
| 0 |
将其添加到回填原始列:
df['A'] = df['A'].bfill() + posCumSum
| ind | A | B |
------------------------
| 1.01 | 10 | -1.734 |
| 1.04 | 10 | -1.244 |
| 1.05 | 10 | 0.016 |
| 1.11 | 13 | -2.737 | <-
| 1.13 | 12 | -4.232 | <-
| 1.19 | 11 | -3.241 | <=
| 1.20 | 12 | -2.832 |
| 1.21 | 10 | -4.277 |
推荐阅读
- r - 将篮子数据框融化为没有循环的单个数据框
- c - 如何将单个字符从字符串数组复制到“C”中的另一个字符串
- php - 如何替换字符串中选定的针
- java - 内存不足 Solr 3.4
- yaml - 在 Rmarkdown 中使用 before_body 获取 html 文档
- php - 不同的令牌过期取决于客户端 Laravel Passport
- sql - 如何创建查询以从我的表中提取值
- ansible - 在 ansible-awx 上,删除现有的唯一一个后无法创建系统管理员
- c++ - Visual C++ for linux'路径中的非法字符'错误
- laravel - 在 VueJS 中使用 axios 发送 FormData() 在 Laravel 中返回空数组