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

如何正确拼接pandas DataFrame?运行代码报KeyError:0如何排查?

问题根因

  1. 访问不存在的列触发KeyError
    你明确说明test_delta_df没有cycle_end_date列,但代码多处调用该不存在的字段:
  • 初始化parent_df_1、parent_df_2时,drop了不存在的cycle_end_date、prime_tagging列
  • 循环遍历test_delta_df["cycle_end_date"].unique()时直接访问不存在的列
    如果test_delta_df同时没有prime_tagging列,筛选条件里的调用也会触发相同错误。
  1. 变量调用顺序错误
    你在循环中调用assign_flag时,one_lower_bound、one_upper_bound等边界参数还未完成赋值,赋值语句写在了循环之后,属于先使用后定义。

  2. 数组维度不匹配

  • 构造delta_list时给筛选后的DataFrame额外套了一层列表,传入assign_flag后转numpy数组会生成三维结构,和边界值的一维数组无法对齐计算
  • assign_flag中给np.where的返回结果额外套了一层列表,返回的flag结构多了不必要的维度,后续转DataFrame时结构不匹配。
  1. 语法与逻辑错误
  • 拼写错误:构造flag_1_df时把columns拼写成了colmuns,会触发属性错误
  • 拼接逻辑错误:循环中concat生成的新数据没有赋值回parent_df_1,循环结束后parent_df_1还是空表;flag_2_df的构造逻辑完全错误,不能直接把flag_1和parent_df_2放到列表里生成DataFrame。

修复参考代码

先确保你要用到的cycle_end_date、prime_tagging已经正确加入test_delta_df(如果是和flag_tbl关联的字段,需要先做表关联补全字段),再使用修改后的代码:

import pandas as pd
import numpy as np

# 先定义边界参数,再调用函数
one_lower_bound = list(flag_tbl_2.iloc[3])
one_upper_bound = list(flag_tbl_2.iloc[2])
two_upper_bound = list(flag_tbl_2.iloc[4])
two_lower_bound = list(flag_tbl_2.iloc[5])

def assign_flag(delta_arr, one_lower_bound, one_upper_bound, two_upper_bound, two_lower_bound):
    # 去掉多余的列表包裹,直接返回数组
    flag_1 = np.where(
        (delta_arr > np.array(one_lower_bound)) & (delta_arr < np.array(one_upper_bound)),
        0,
        1
    )
    flag_2 = np.where(
        (delta_arr > np.array(two_lower_bound)) & (delta_arr < np.array(two_upper_bound)),
        0,
        1
    )
    return flag_1, flag_2

# 先获取数值列名,加errors='ignore'避免不存在的列报错
val_cols = test_delta_df.drop(columns=["cycle_end_date", "prime_tagging"], errors='ignore').columns
parent_df_1 = pd.DataFrame(columns=val_cols)
parent_df_2 = pd.DataFrame(columns=val_cols)

for date in test_delta_df["cycle_end_date"].unique():
    print(date)
    # 筛选数据,delta直接取数组,不用套列表
    delta_df = test_delta_df[
        (test_delta_df.cycle_end_date == date) & (test_delta_df.prime_tagging == "New")
    ].drop(columns=["cycle_end_date", "prime_tagging"], errors='ignore')
    delta_arr = delta_df.values
    flag_1, flag_2 = assign_flag(delta_arr, one_lower_bound, one_upper_bound, two_upper_bound, two_lower_bound)
    # 构造对应DataFrame
    flag_1_df = pd.DataFrame(flag_1, columns=val_cols)
    flag_2_df = pd.DataFrame(flag_2, columns=val_cols)
    # 拼接结果赋值回父表,加ignore_index=True避免索引冲突
    parent_df_1 = pd.concat([flag_1_df, parent_df_1], ignore_index=True)
    parent_df_2 = pd.concat([flag_2_df, parent_df_2], ignore_index=True)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:36:06