如何将模型预测数组追加到DataFrame最后一列?选for循环还是zip函数?
问题:如何将逻辑回归预测结果合并到目标DataFrame?
场景还原
- 逻辑回归模型的5条样本预测输出:
In[] logireg.predict(X.head(5)) Out[] array([0, 0, 0, 1, 0], dtype=int64)
- 原始的DataFrame数据:
| age | job | month |
|---|---|---|
| 33 | blue | apr |
| 56 | admin | jun |
| 37 | tech | aug |
| 76 | retired | jun |
| 56 | service | may |
- 想要得到的最终结果:
| age | job | month | predict |
|---|---|---|---|
| 33 | blue | apr | 0 |
| 56 | admin | jun | 0 |
| 37 | tech | aug | 0 |
| 76 | retired | jun | 1 |
| 56 | service | may | 0 |
提问:实现这个需求,应该用for循环还是zip函数?
解答
其实两种方式都能实现,但zip函数的写法会更简洁高效,也更符合Pythonic风格,不过我得先告诉你:还有个更简单的方法——完全不用循环或zip,直接赋值就行!下面给你逐一说明:
1. 最推荐:直接给DataFrame新增列赋值
因为你的预测结果数组长度和DataFrame的行数完全匹配,直接给原DataFrame新增一列赋值是最省心高效的操作,一行代码搞定:
predictions = logireg.predict(X.head(5)) df['predict'] = predictions
这也是pandas处理这类场景的标准操作,没必要绕弯子用循环。
2. 用zip函数的实现方式
如果是出于学习目的想尝试zip,有两种写法:
写法一:用zip拼接数据后转成新DataFrame
predictions = logireg.predict(X.head(5)) # 把原DataFrame的列和预测结果用zip打包成元组列表 combined_data = list(zip(df['age'], df['job'], df['month'], predictions)) # 转成新的DataFrame并指定列名 new_df = pd.DataFrame(combined_data, columns=['age', 'job', 'month', 'predict'])
写法二:用zip配合列表推导式给原df加列
predictions = logireg.predict(X.head(5)) df['predict'] = [pred for _, _, _, pred in zip(df['age'], df['job'], df['month'], predictions)]
这种写法比手动for循环紧凑,也不用操心索引匹配的问题。
3. 用for循环的实现方式
用for循环的话需要手动遍历索引,把每个预测值对应到行,写法繁琐还容易出错(比如索引不连续的时候就会出问题):
predictions = logireg.predict(X.head(5)) # 先初始化新列 df['predict'] = 0 # 遍历索引赋值 for idx in range(len(df)): df.loc[idx, 'predict'] = predictions[idx]
除非有特殊场景需要逐行处理,否则不推荐这种方式。
总结:优先用直接赋值的方法,其次考虑zip,尽量避免手动for循环。
内容的提问来源于stack exchange,提问作者BigData
相关产品推荐
相关产品推荐

