如何在start与finish字符串之间的NaN填充指定值check
解决方案:填充指定区间内的NaN值
问题说明
需要将数据中位于start和finish字符串之间的nan值替换为check,区间外的nan保持不变。ffill()或interpolate()这类方法会持续填充后续值,无法满足仅填充指定区间的需求。
原始数据
| start_finish |
|---|
| start |
| nan |
| nan |
| finish |
| nan |
| nan |
| start |
| nan |
| nan |
| start |
| nan |
| finish |
预期结果
| start_finish |
|---|
| start |
| check |
| check |
| finish |
| nan |
| nan |
| start |
| nan |
| nan |
| start |
| check |
| finish |
代码实现
方法1:遍历标记(逻辑直观)
适合小数据集,逻辑清晰易懂:
import pandas as pd # 构造原始数据(若实际为pd.NA/np.nan,替换对应值即可) data = { 'start_finish': [ 'start', 'nan', 'nan', 'finish', 'nan', 'nan', 'start', 'nan', 'nan', 'start', 'nan', 'finish' ] } df = pd.DataFrame(data) # 标记需要填充的位置 in_interval = False fill_mask = [] for val in df['start_finish']: if val == 'start': in_interval = True fill_mask.append(False) elif val == 'finish': in_interval = False fill_mask.append(False) elif in_interval and val == 'nan': fill_mask.append(True) else: fill_mask.append(False) # 执行填充 df.loc[fill_mask, 'start_finish'] = 'check'
方法2:向量化处理(高效)
适合大数据集,利用pandas的向量化操作提升效率:
import pandas as pd # 构造原始数据 data = { 'start_finish': [ 'start', 'nan', 'nan', 'finish', 'nan', 'nan', 'start', 'nan', 'nan', 'start', 'nan', 'finish' ] } df = pd.DataFrame(data) # 标记start和finish的位置 start_mask = df['start_finish'] == 'start' finish_mask = df['start_finish'] == 'finish' # 生成区间分组标识 group = start_mask.cumsum() # 筛选出需要填充的位置:在有效区间内、不是finish、且值为nan fill_mask = (group > 0) & ~finish_mask.cumsum().eq(group) & (df['start_finish'] == 'nan') # 执行填充 df.loc[fill_mask, 'start_finish'] = 'check'
内容的提问来源于stack exchange,提问作者Will Lambert
相关产品推荐
相关产品推荐

