You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:39:50