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
相关产品推荐
相关产品推荐

