循环中追加Pandas DataFrame失效,如何修复?
问题修复:DataFrame无法追加,shape始终为(1,6)
问题原因
循环里的df是原DataFrame(df_SMOTE/df_ENN/df_Ensemble)的局部引用,执行df = pd.concat(...)时,只是把局部变量df重新绑定到新生成的DataFrame,根本没修改原来的全局DataFrame对象。每次循环迭代时,df又会被重新赋值为原空DataFrame,导致每次拼接后只有1行,shape始终是(1,6)。
修复方案
用字典存储三个DataFrame,通过字典键直接修改原对象,避免局部变量重新绑定的问题。这种方式还能减少重复代码,更易维护。
修复后代码
columns = ['name', 'precision', 'recall', 'gmean', 'f1', 'mse'] # 用字典存储三个目标DataFrame df_map = { 'smote': pd.DataFrame(columns=columns), 'enn': pd.DataFrame(columns=columns), 'ensemble': pd.DataFrame(columns=columns) } # 遍历模型 for name, model in zip(names, [rfc, knc, lr, svc, dtc, xgbc, cbc, lgbc]): # 遍历每个数据集对应的字典键、特征、标签 for df_key, X, y in [('smote', X_smote, y_smote), ('enn', X_enn, y_enn), ('ensemble', X_smote, y_smote)]: learner = Learner(model, X, y) learner() precision, recall, gmean, f1, mse = learner.get_metrics() # 生成新行DataFrame new_row = pd.DataFrame({ 'name': [name], 'precision': [precision], 'recall': [recall], 'gmean': [gmean], 'f1': [f1], 'mse': [mse] }) # 直接修改字典中的原DataFrame df_map[df_key] = pd.concat([df_map[df_key], new_row], ignore_index=True) print(df_map[df_key].shape) # 如需单独提取,可从字典中取出 df_SMOTE = df_map['smote'] df_ENN = df_map['enn'] df_Ensemble = df_map['ensemble']
替代方案(直接操作原变量)
如果不想用字典,也可以直接对每个全局DataFrame变量单独处理,虽然代码重复但逻辑直观:
columns = ['name', 'precision', 'recall', 'gmean', 'f1', 'mse'] df_SMOTE = pd.DataFrame(columns=columns ) df_ENN = pd.DataFrame(columns=columns ) df_Ensemble = pd.DataFrame(columns=columns ) for name, model in zip(names, [rfc, knc, lr, svc, dtc, xgbc, cbc, lgbc]): # 处理SMOTE数据集 learner = Learner(model, X_smote, y_smote) learner() p, r, gm, f, ms = learner.get_metrics() df_SMOTE = pd.concat([df_SMOTE, pd.DataFrame({'name':[name], 'precision':[p], 'recall':[r], 'gmean':[gm], 'f1':[f], 'mse':[ms]})], ignore_index=True) print(df_SMOTE.shape) # 处理ENN数据集 learner = Learner(model, X_enn, y_enn) learner() p, r, gm, f, ms = learner.get_metrics() df_ENN = pd.concat([df_ENN, pd.DataFrame({'name':[name], 'precision':[p], 'recall':[r], 'gmean':[gm], 'f1':[f], 'mse':[ms]})], ignore_index=True) print(df_ENN.shape) # 处理Ensemble数据集 learner = Learner(model, X_smote, y_smote) learner() p, r, gm, f, ms = learner.get_metrics() df_Ensemble = pd.concat([df_Ensemble, pd.DataFrame({'name':[name], 'precision':[p], 'recall':[r], 'gmean':[gm], 'f1':[f], 'mse':[ms]})], ignore_index=True) print(df_Ensemble.shape)
内容的提问来源于stack exchange,提问作者some nooby questions
相关产品推荐
相关产品推荐

