如何在Pandas数据集指定行用Sklearn预测并保留原顺序?
对Pandas部分行调用Sklearn模型predict并保留原行顺序的方法
当然可以实现,核心思路是先创建一个与原DataFrame行数匹配的全NaN数组,再将选中行的预测结果填充到对应位置,既能保留原行顺序,又能给未选中行设为NaN。
注意:你的示例数据中包含字符串列(B列),Sklearn模型无法直接处理非数值型特征,所以需要先对这类特征做编码处理(比如独热编码、标签编码),否则会报错。以下是完整的实现代码:
import pandas as pd from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 模拟训练数据与流程(假设训练集和测试集特征结构一致) X_train = pd.DataFrame({ "A": [2, 4, 3, 6], "B": ["a", "b", "a", "b"], "c": [4, 6, 5, 7] }) y_train = [0, 1, 0, 1] # 构建预处理+模型的管道,处理字符串特征 preprocessor = ColumnTransformer( transformers=[ ('cat', OneHotEncoder(sparse_output=False, drop='first'), ['B']) ], remainder='passthrough' # 保留其他数值列 ) clf = Pipeline(steps=[ ('preprocessor', preprocessor), ('classifier', RandomForestClassifier()) ]) # 训练模型 clf.fit(X_train, y_train) # 你的原始数据和选择条件 selection = [True, True, False, False, True, False] data = pd.DataFrame.from_dict( { "A": [1, 5, 3, 6, 5, 7], "B": ["a", "b", "a", "a", "b", "b"], "c": [5, 7, 4, 6, 5, 2], } ) # 初始化全NaN的结果序列(与原数据索引对齐) predictions = pd.Series([pd.NA] * len(data), index=data.index) # 对选中行执行预测,填充到对应位置 predictions[selection] = clf.predict(data[selection]) # 将结果添加到原DataFrame data['prediction'] = predictions print(data)
代码说明
- 用
pd.Series([pd.NA] * len(data))创建与原数据行数一致的空结果序列,确保索引和原DataFrame完全对齐 - 通过
predictions[selection] = clf.predict(data[selection]),将预测结果精准填充到选中行的位置 - 最终的
data['prediction']列会严格保留原行顺序,未选中行的值自动为NaN
内容的提问来源于stack exchange,提问作者GiusWestsideDS
相关产品推荐
相关产品推荐

