基于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的内容如下:
| INPUT | OUTPUT | |
|---|---|---|
| 0 | A | A |
| 1 | B | A |
| 2 | B | A |
| 3 | B | A |
| 4 | B | A |
| 5 | B | A |
| 6 | A | A |
| 7 | B | A |
| 8 | B | A |
| 9 | C | C |
| 10 | B | C |
| 11 | B | C |
| 12 | C | C |
| 13 | B | C |
| 14 | B | C |
| 15 | A | A |
| 16 | B | A |
| 17 | C | C |
内容的提问来源于stack exchange,提问作者Krishnendu Dutta
相关产品推荐
相关产品推荐

