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

使用Pandas筛选数据时出现列KeyError问题求助

问题描述

尝试使用Pandas常规语法df[df[column_name] == "value"]按列值筛选数据时,始终收到针对列"Product (ACQ Search) - ONC"的KeyError。同时发现用df.columns查看列名时,仅显示脚本中之前重命名的4列,请问为何会出现该错误?

代码示例
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
import pandas as pd  # 原代码遗漏pandas导入,此处补充

# 加载Excel文件到DataFrame
df = pd.read_excel("Marginal CPA data - NOV.xlsx")

# 删除最后一行
df = df[:-1]

# 筛选"Campaign Type (Search ACQ) - ONC"列值为"NonBrand"的行
df = df[df["Campaign Type (Search ACQ) - ONC"] == "NonBrand"]

# 转换日期格式并删除原Day列
df["Date"] = pd.to_datetime(df["Day"], format="%d %b %Y")
df = df.drop("Day", axis=1)

# 创建透视表
pivot_table = pd.pivot_table(df, values=["Media Cost", "CAFE Approvals"],
                              index=["Campaign Type (Search ACQ) - ONC", "Product (ACQ Search) - ONC", "Date"],
                              columns=["CDJ"], aggfunc="sum")

df_pivot = pivot_table.fillna(value=0)

# 将多级列索引合并为单级
df_pivot.columns = ["_".join(col) for col in df_pivot.columns]

# 重命名列
cols = {
    "Media Cost_CPA": "CPA Spend",
    "Media Cost_Non CPA (CDJ)": "CDJ Spend",
    "CAFE Approvals_CPA": "CPA Approvals",
    "CAFE Approvals_Non CPA (CDJ)": "CDJ Approvals"
}
df_pivot = df_pivot.rename(columns=cols)

# 新增总计列
df_pivot["Total Approvals"] = df_pivot["CPA Approvals"] + df_pivot["CDJ Approvals"]
df_pivot["Total Spend"] = df_pivot["CPA Spend"] + df_pivot["CDJ Spend"]

# 过滤花费为0或审批数为0的行
df_pivot = df_pivot[df_pivot["CPA Spend"] != 0]
df_pivot = df_pivot[df_pivot["Total Approvals"] != 0]

# 按日期和产品排序
df_pivot = df_pivot.sort_values("Date", ascending=True)
df_pivot = df_pivot.sort_values("Product (ACQ Search) - ONC", ascending=True)

# 保存处理后的数据
df_pivot.to_excel("Marginal CPA data - NOV (processed).xlsx")

# 筛选"Product (ACQ Search) - ONC"为"Consumer"的行(此处报错)
consumer_data = df_pivot[df_pivot["Product (ACQ Search) - ONC"] == "Consumer"]
数据示例
Campaign Type (Search ACQ) - ONCProduct (ACQ Search) - ONCCDJDayMedia CostCAFE Approvals
NonBrandConsumerCPA11 Jan 202329019.7741594
NonBrandConsumerNon CPA (CDJ)17 Jan 202324640.3644886
NonBrandConsumerNon CPA (CDJ)12 Jan 202323627.7825678
NonBrandStudentCPA17 Jan 202329863.95447152
NonBrandMilesCPA23 Jan 2023380.941
NonBrandMilesCPA07 Jan 20231786.515
NonBrandConsumerCPA19 Jan 202326745.8170564
NonBrandSecuredCPA20 Jan 20231551.3519
NonBrandConsumerNon CPA (CDJ)02 Feb 202341185.1122566
NonBrandStudentCPA08 Jan 202342822.8508171
NonBrandStudentCPA16 Jan 202329408.66012160
NonBrandConsumerCPA17 Jan 202329378.0522785
NonBrandMilesCPA10 Jan 20232019.254
NonBrandMilesCPA11 Jan 20231604.984
NonBrandSecuredCPA21 Jan 20231704.1341922
原因分析与解决方法

核心原因

创建透视表时,你把"Product (ACQ Search) - ONC"设为了行索引(index),而非普通数据列。后续处理中没有将索引还原为列,导致:

  1. 用列名访问时,Pandas找不到该列,抛出KeyError;
  2. df.columns仅显示普通数据列,所以只能看到重命名后的4列以及新增的总计列。

解决方法

方法1:将索引转为普通列(推荐)

在透视表填充空值后,添加reset_index()方法,把所有索引列转为普通列:

df_pivot = pivot_table.fillna(value=0)
# 新增此行,将索引转为列
df_pivot = df_pivot.reset_index()

之后再执行筛选代码即可正常运行。

方法2:直接通过索引筛选

如果不想修改索引结构,可以通过索引层级来筛选:

consumer_data = df_pivot[df_pivot.index.get_level_values("Product (ACQ Search) - ONC") == "Consumer"]

补充说明

之前的sort_values("Product (ACQ Search) - ONC")能生效,是因为Pandas的sort_values支持直接指定索引名称排序,但筛选操作必须明确访问列或索引层级。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:25:27