如何正确拼接pandas DataFrame?运行代码报KeyError:0如何排查?
问题根因
- 访问不存在的列触发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列,筛选条件里的调用也会触发相同错误。
变量调用顺序错误
你在循环中调用assign_flag时,one_lower_bound、one_upper_bound等边界参数还未完成赋值,赋值语句写在了循环之后,属于先使用后定义。数组维度不匹配
- 构造
delta_list时给筛选后的DataFrame额外套了一层列表,传入assign_flag后转numpy数组会生成三维结构,和边界值的一维数组无法对齐计算 assign_flag中给np.where的返回结果额外套了一层列表,返回的flag结构多了不必要的维度,后续转DataFrame时结构不匹配。
- 语法与逻辑错误
- 拼写错误:构造
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
相关产品推荐
相关产品推荐

