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

Pandas DataFrame循环提取匹配列时触发KeyError的问题咨询

问题分析与解决方案

错误原因

嘿,我一眼就揪出问题所在啦!你的bug出在列选取时多套了一层中括号!

看这段出问题的代码:

temp_df = df[[match_names]]

match_names本身已经是一个包含目标列名的列表(比如遍历到var2时,它是['var2_1', 'var2_2']),但你给它又套了一层中括号,这就导致Pandas把整个match_names列表当成了一个单独的"列名"去查找——而你的DataFrame里根本不存在名为['var2_1', 'var2_2']的列,自然就抛出KeyError了。

对比你单独测试的df[['var2_1', 'var2_2']],这里你是直接传递了列名的列表,而不是把列表再包一层,所以能正常工作。

修正后的代码

只需要去掉多余的那层中括号,把df[[match_names]]改成df[match_names]即可:

import re
import numpy as np
import pandas as pd

cars = {'var1_1': [1, np.nan, np.nan, np.nan], 
        'var1_2': [np.nan, 1, 1, np.nan], 
        'var1_3': [np.nan, np.nan, 1, np.nan], 
        'var2_1': [1, np.nan, 1, np.nan], 
        'var2_2': [np.nan, 1, 1, np.nan], 
        'var3': [1, np.nan, 1, 1] }
df = pd.DataFrame(cars, columns = ['var1_1', 'var1_2', 'var1_3', 'var2_1', 'var2_2', 'var3'])

root_names = ['var2', 'var3', 'var1']
df_list = []
for var in root_names:
    match_names = [x for x in list(df) if re.match(var,x)]
    temp_df = df[match_names]  # 去掉多余的中括号
    df_list.append(temp_df)

# 验证结果
for idx, sub_df in enumerate(df_list):
    print(f"df_list[{idx}] 内容:")
    print(sub_df)
    print("---")

运行结果

修正后代码会输出符合预期的子DataFrame:

df_list[0] 内容:
   var2_1  var2_2
0     1.0     NaN
1     NaN     1.0
2     1.0     1.0
3     NaN     NaN
---
df_list[1] 内容:
   var3
0   1.0
1   NaN
2   1.0
3   1.0
---
df_list[2] 内容:
   var1_1  var1_2  var1_3
0     1.0     NaN     NaN
1     NaN     1.0     NaN
2     NaN     1.0     1.0
3     NaN     NaN     NaN
---

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:12:39