我正在尝试使用 scikit-learn 来LabelEncoder编码 pandasDataFrame字符串标签。由于数据框有很多 (50+) 列,我想避免LabelEncoder为每一列创建一个对象;我宁愿只创建一个LabelEncoder适用于我所有数据列的大对象。
LabelEncoder
DataFrame
将整个DataFrame放入LabelEncoder会产生以下错误。请记住,我在这里使用的是虚拟数据;实际上,我正在处理大约 50 列带字符串标签的数据,因此需要一个不按名称引用任何列的解决方案。
import pandas from sklearn import preprocessing df = pandas.DataFrame({ 'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'], 'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'], 'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego', 'New_York'] }) le = preprocessing.LabelEncoder() le.fit(df)
回溯(最近一次调用最后一次):文件“”,第 1 行,在文件“/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py”,第 103 行,在 fit y = column_or_1d(y,warn=True)文件“/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py”,第 306 行,在 column_or_1d 中引发 ValueError(“错误输入形状 {0}”。格式(shape))ValueError:错误输入形状(6,3)
关于如何解决这个问题您有什么想法吗?
LabelEncoder无法直接使用整个 DataFrame,因为LabelEncoder它需要的是 1D 标签数组,而不是 DataFrame。但是,您可以将它LabelEncoder单独应用于每一列,而不必按名称引用每一列。
以下是实现此目的的方法apply:
apply
import pandas as pd from sklearn.preprocessing import LabelEncoder # Sample DataFrame df = pd.DataFrame({ 'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'], 'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'], 'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego', 'New_York'] }) # Create a LabelEncoder instance le = LabelEncoder() # Apply LabelEncoder to each column in the DataFrame encoded_df = df.apply(lambda col: le.fit_transform(col)) print(encoded_df)
df
pets
owner
location
le = LabelEncoder()
df.apply(lambda col: le.fit_transform(col))
le.fit_transform(col)
encoded_df
这是存储每列编码器的扩展版本:
# Dictionary to store encoders for each column encoders = {} # Apply LabelEncoder to each column and store the encoders encoded_df = df.apply(lambda col: encoders.setdefault(col.name, LabelEncoder()).fit_transform(col)) print(encoded_df) print(encoders)
在此版本中,encoders是一个字典,其中每个键都是一个列名,每个值都是相应的LabelEncoder实例。这允许您根据需要访问特定列的编码器。
encoders