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

循环中追加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:01:04