如何在Python中基于后一行条件填充指定列的字符串缺失值
基于后一行条件交替填充缺失值的解决方案
错误原因分析
你之前的代码报错是因为fillna()的value参数不接受numpy数组(ndarray),它需要标量、字典或与原DataFrame索引对齐的Series。另外,你用了shift(1)取前一行的值,但需求是基于后一行判断,这会导致逻辑方向错误。
方案1:修正原代码(向量操作,高效)
将np.where的结果转为Series,同时把shift(1)改成shift(-1)来获取后一行的值:
import pandas as pd import numpy as np # 示例测试数据 df = pd.DataFrame({ 'Monitoring Desc': [np.nan, 'ws_connect', np.nan, 'ws_disconnect', np.nan] }) # 填充缺失值:基于后一行的值交替 df['Monitoring Desc'] = df['Monitoring Desc'].fillna( pd.Series( np.where(df['Monitoring Desc'].shift(-1) == "ws_connect", "ws_disconnect", "ws_connect"), index=df.index ) )
方案2:先获取后一行值再填充(更直观)
先用bfill()获取每个缺失值对应的后一行非缺失值,再根据这个值填充相反状态:
# 获取后一行的非缺失值作为参考 next_status = df['Monitoring Desc'].bfill() # 填充缺失值:与后一行状态交替 df['Monitoring Desc'] = df['Monitoring Desc'].fillna( np.where(next_status == "ws_connect", "ws_disconnect", "ws_connect") )
方案3:循环遍历(适合新手理解逻辑)
如果对向量操作不熟悉,从后往前遍历的循环方法更直观,每遇到缺失值就参考后一行的值填充相反状态:
# 从倒数第二行开始往前遍历 for i in range(len(df)-2, -1, -1): if pd.isna(df.loc[i, 'Monitoring Desc']): next_val = df.loc[i+1, 'Monitoring Desc'] df.loc[i, 'Monitoring Desc'] = "ws_disconnect" if next_val == "ws_connect" else "ws_connect"
结果验证
以上三种方法处理示例数据后,都会得到如下结果:
| Monitoring Desc |
|---|
| ws_disconnect |
| ws_connect |
| ws_disconnect |
| ws_disconnect |
| ws_connect |
内容的提问来源于stack exchange,提问作者SPHS
相关产品推荐
相关产品推荐

