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

基于Pandas DataFrame前一行同列生成OUTPUT列(Numpy实现)及报错修复

问题解决:基于前置非B值生成OUTPUT列

数据集与需求

给定数据集:

import pandas as pd
import numpy as np

x = {"INPUT" : ['A','B','B','B','B','B','A','B','B','C','B','B','C','B','B','A','B','C']}
df = pd.DataFrame(x)

需要生成OUTPUT列,规则如下:

  • 当INPUT值为A时,OUTPUT为A
  • 当INPUT值为C时,OUTPUT为C
  • 当INPUT值为B时,OUTPUT取该位置最近的前置非B值(即前面最近的A或C)

原代码报错原因

你写的代码出现KeyError: 'OUTPUT',是因为在定义条件时引用了还未创建的df["OUTPUT"]列,此时该列不存在,自然无法调用shift方法。此外,原逻辑试图用shift依赖前一行的OUTPUT,这种方式会导致循环依赖,无法正确初始化。

正确实现方案

需求本质是将每个B替换为最近的前置非B值,用**向前填充(forward fill)**的思路最高效,适合大数据集。以下是两种实现方式:

方式1:Pandas 原生方法(简洁高效)

# 先复制INPUT列到OUTPUT
df["OUTPUT"] = df["INPUT"]
# 将OUTPUT中的B替换为NaN,然后向前填充非NaN值
df["OUTPUT"] = df["OUTPUT"].replace("B", np.nan).ffill()

方式2:Numpy 实现(适合极致性能需求)

如果必须用Numpy实现,可通过标记非B位置,然后向前填充对应值:

# 获取INPUT的数组形式
input_arr = df["INPUT"].values
# 标记非B的索引位置
non_b_mask = input_arr != "B"
# 记录非B位置的值和索引
non_b_values = input_arr[non_b_mask]
non_b_indices = np.where(non_b_mask)[0]
# 用np.searchsorted找到每个位置对应的最近前置非B索引
fill_indices = np.searchsorted(non_b_indices, np.arange(len(input_arr)), side="right") - 1
# 生成结果数组并赋值给DataFrame
df["OUTPUT"] = non_b_values[fill_indices]

验证结果

执行后df的内容如下:

INPUTOUTPUT
0AA
1BA
2BA
3BA
4BA
5BA
6AA
7BA
8BA
9CC
10BC
11BC
12CC
13BC
14BC
15AA
16BA
17CC

内容的提问来源于stack exchange,提问作者Krishnendu Dutta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:26:21