如何从另一DataFrame取值对DF空值做带限制的ffill并解决fillna参数报错
报错原因
pandas的fillna()方法不允许同时传入value和method参数,这是框架的内置语法限制,因此你之前的写法会抛出对应的ValueError。
实现方案
你需要实现的是用DF2的对应值填充DF1中可以被前向填充覆盖的空值,且每段连续空值最多填充2个,可以用以下代码实现:
import pandas as pd # 标记DF1的空值位置 is_na = DF1.isna() # 按列判断当前位置上方是否已经出现过有效值(过滤列开头的连续空值,这部分ffill无法覆盖) has_valid_above = DF1.notna().cummax(axis=0) # 对每列的连续空值做分组,相同分组属于同一段连续空值 na_group = (~is_na).cumsum(axis=0) # 统计每个连续空值段的空值序号,仅保留前2个空值的位置 within_limit = is_na.groupby(na_group, axis=1).cumsum(axis=0) <= 2 # 组合得到最终需要填充的位置 fill_mask = is_na & has_valid_above & within_limit # 用DF2的对应值填充DF1的指定位置 result = DF1.mask(fill_mask, DF2)
输出结果
运行代码后得到的结果和你预期一致:
| CompanyId | 1/1/2018 | 1/1/2019 | 1/1/2020 | 1/1/2021 |
|---|---|---|---|---|
| 1 | 10 | 15 | nan | nan |
| 2 | 12 | 16 | nan | 12 |
| 3 | 14 | 17 | nan | 13 |
| 4 | 24 | 18 | 12 | 14 |
| 5 | 25 | 18 | 13 | 55 |
| 6 | nan | 36 | 14 | 56 |
内容的提问来源于stack exchange,提问作者Gal
相关产品推荐
相关产品推荐

