如何基于其他列百分比变化填充DataFrame中的连续NaN值
问题:利用列C的百分比变化值填充列B的连续NaN值
单个NaN的填充场景
当列B仅存在一个NaN值时,可通过列C的百分比变化值替换该NaN:
创建示例DataFrame:
import pandas as pd import numpy as np df_stack = pd.DataFrame({'A': [2, 4, 8, 0,6], 'B': [2, 4, np.NaN, 5,7], 'C': [10, 2, 1, 8,9]}, index=['1', '2', '3', '4', '5'])
原始数据:
| A | B | C | |
|---|---|---|---|
| 1 | 2 | 2.0 | 10 |
| 2 | 4 | 4.0 | 2 |
| 3 | 8 | NaN | 1 |
| 4 | 0 | 5.0 | 8 |
| 5 | 6 | 7.0 | 9 |
使用以下代码可完成填充:
df_stack['B'] = df_stack['B'].fillna( ( df_stack['C'] / df_stack['C'].shift(1) ) * df_stack['B'].shift(1) )
填充后结果:
| A | B | C | |
|---|---|---|---|
| 1 | 2 | 2.0 | 10 |
| 2 | 4 | 4.0 | 2 |
| 3 | 8 | 2.0 | 1 |
| 4 | 0 | 5.0 | 8 |
| 5 | 6 | 7.0 | 9 |
连续NaN的填充问题
当列B存在两个及以上连续NaN值时,上述方法仅能填充第一个NaN,剩余NaN会被保留:
创建带连续NaN的DataFrame:
df_stack = pd.DataFrame({'A': [2, 4, 8, 0,6], 'B': [2, 4, np.NaN, np.NaN ,7], 'C': [10, 2, 1, 8,9]}, index=['1', '2', '3', '4', '5'])
用上述代码填充后的结果:
| A | B | C | |
|---|---|---|---|
| 1 | 2 | 2.0 | 10 |
| 2 | 4 | 4.0 | 2 |
| 3 | 8 | 2.0 | 1 |
| 4 | 0 | NaN | 8 |
| 5 | 6 | 7.0 | 9 |
预期需求
需要一种无需循环的方法,逐行(从上到下)完成连续NaN的填充,得到如下预期输出:
| A | B | C | |
|---|---|---|---|
| 1 | 2 | 2.0 | 10 |
| 2 | 4 | 4.0 | 2 |
| 3 | 8 | 2.0 | 1 |
| 4 | 0 | 16.0 | 8 |
| 5 | 6 | 7.0 | 9 |
内容的提问来源于stack exchange,提问作者EMT
相关产品推荐
相关产品推荐

