Pandas特殊插值实现:将NaN行与目标行替换为均分后的值
自定义插值替换需求
示例输入表格
| Label | Value |
|---|---|
| A | 1 |
| B | 2 |
| C | NaN |
| D | NaN |
| E | NaN |
| F | 12 |
示例输出表格
| Label | Value |
|---|---|
| A | 1 |
| B | 2 |
| C | 3 |
| D | 3 |
| E | 3 |
| F | 3 |
处理逻辑
- 针对连续的NaN区间,取该区间后续第一个非NaN有效值
- 计算替换值:后续有效值 ÷(该区间NaN的数量 + 1),示例中为
12 ÷ (3+1) = 3 - 用计算得到的替换值填充该区间所有NaN,同时替换掉用于计算的那个后续有效值
现有实现代码
import pandas as pd import numpy as np test = pd.DataFrame({'Label': ['A', 'B', 'C', 'D', 'E', 'F','G','H','I'], 'Value': [1, 2, None, None, None, 12,None,None,4]}) test['break'] = np.where(test['Value'].notnull(),1,0) test['group'] = test['break'].shift().fillna(0).cumsum() test['Value2'] = test.groupby('group').Value.apply(lambda x: x.fillna( x.max() / len(x))) for row in range(0,test.shape[0]): if test['break'].iloc[row] == 0 and test['break'].iloc[row+1] == 1: test.at[row+1, 'Value2'] = test['Value2'].iloc[row]
优化需求
df.interpolate()无法实现该自定义逻辑,现有代码可完成功能但不够简洁优雅,寻求更优的Pandas解决方案。
内容的提问来源于stack exchange,提问作者ppoudel
相关产品推荐
相关产品推荐

