others - python -迭代Pandas数据帧时'KeyError'?

我有两个列表Y_trainY_test,每个元素要么是Blue要么是Green,它们将成为随机森林分类器的目标,我需要它们编码为1.0 s和0.0 s。

下面是一个print(Y_train),显示数据帧的外观,


183 Blue


126 Blue


1 Blue


409 Blue


575 Green


 ... 


396 Blue


192 Blue


578 Green


838 Green


222 Blue


Name: Colour, Length: 896, dtype: object



为了进行编码,我将简单地遍历它们,并将每个元素更改为它们的编码值:


for i in range(len(Y_train)):


 if Y_train[i] == 'Blue':


 Y_train[i] = 0.0


 else:


 Y_train[i] = 1.0



但是,当我这样做时,我得到以下结果:


Traceback (most recent call last):


 File"G:WorkColours.py", line 90, in <module>


 Main()


 File"G:WorkColours.py", line 34, in Main


 RandForest(X_train, Y_train, X_test, Y_test)


 File"G:WorkColours.py.py", line 77, in RandForest


 if Y_train[i] == 'Blue':


 File"C:UsersMeAppDataRoamingPythonPython37site-packagespandascoreseries.py", line 1068, in __getitem__


 result = self.index.get_value(self, key)


 File"C:UsersMeAppDataRoamingPythonPython37site-packagespandascoreindexesbase.py", line 4730, in get_value


 return self._engine.get_value(s, k, tz=getattr(series.dtype,"tz", None))


 File"pandas_libsindex.pyx", line 80, in pandas._libs.index.IndexEngine.get_value


 File"pandas_libsindex.pyx", line 88, in pandas._libs.index.IndexEngine.get_value


 File"pandas_libsindex.pyx", line 131, in pandas._libs.index.IndexEngine.get_loc


 File"pandas_libshashtable_class_helper.pxi", line 992, in pandas._libs.hashtable.Int64HashTable.get_item


 File"pandas_libshashtable_class_helper.pxi", line 998, in pandas._libs.hashtable.Int64HashTable.get_item


KeyError: 6



我不太明白大家是如何正确迭代数据帧的。

时间:

尝试以下方法:


 Y_train[Y_train == 'Blue']=0.0


 Y_train[Y_train == 'Green']=1.0



可以解决你的问题。

如果你使用自己的方法来标记编码,最好创建一个单独的编码列,而不要修改原始列,此后,可以将编码列分配给数据框,


encoded = np.ones((Y_train.shape[0],1))


for i in range(Y_train.shape[0]):


 if Y_train[i] == 'Blue':


 encoded[i] = 0



请注意,这只适用于如果你有两个类别。

对于多个类别,可以使用sklearn或pandas方法。

用于多类别

另一种方法是使用Pandas cat.codes .You可以将类别代码和类别序列转换为。


Y_train = pd.Series(Y_train)


encoded = Y_train.astype("category").cat.codes



你可以使用sklearn Labelencoder编码分类数据。


from sklearn.preprocessing import LabelEncoder 


le = LabelEncoder()


encoded = le.fit_transform(Y_train)




from sklearn import preprocessing 



label_encoder = preprocessing.LabelEncoder() 



# Transforms the 'column' in your dataframe df


df['column']= label_encoder.fit_transform(df['column'])



...