Python 3.x 如何对具有多个数据类型的数据集进行编码?
我有这样一个数据集:Python 3.x 如何对具有多个数据类型的数据集进行编码?,python-3.x,dataframe,scikit-learn,sklearn-pandas,label-encoding,Python 3.x,Dataframe,Scikit Learn,Sklearn Pandas,Label Encoding,我有这样一个数据集: e=pd.DataFrame({ 'col1':['A','A','B','W','F','C'], 'col2':[2,1,9,8,7,4], 'col3':[0,1,9,4,2,3], ‘col4’:[‘a’、‘B’、‘c’、‘D’、‘e’、‘F’] }) 在这里,我使用sklearn.preprocessing.LabelEncoder对数据进行编码。通过以下代码行: x=列表(如列) #导入标签编码器 从sk学习导入预处理 #label\u编码器对象知道如何理解单
e=pd.DataFrame({
'col1':['A','A','B','W','F','C'],
'col2':[2,1,9,8,7,4],
'col3':[0,1,9,4,2,3],
‘col4’:[‘a’、‘B’、‘c’、‘D’、‘e’、‘F’]
})
在这里,我使用sklearn.preprocessing.LabelEncoder
对数据进行编码。通过以下代码行:
x=列表(如列)
#导入标签编码器
从sk学习导入预处理
#label\u编码器对象知道如何理解单词标签。
label_encoder=预处理.LabelEncoder()
对于x中的i:
#对“物种”列中的标签进行编码。
e[i]=标签编码器。拟合变换(e[i])
打印(e)
但这甚至是对int
类型的数字数据点进行编码,这不是必需的
编码数据集:
col1 col2 col3 col4
0 0 1 0 3
1 0 0 1 0
2 1 5 5 4
3 4 4 4 1
4 3 3 2 5
5 2 2 3 2
如何纠正这一点?一个非常简单的可能性是只使用字符串值对列进行编码。例如,将代码调整为:
import pandas as pd
from sklearn import preprocessing
e = pd.DataFrame({
'col1': ['A', 'A', 'B', 'W', 'F', 'C'],
'col2': [2, 1, 9, 8, 7, 4],
'col3': [0, 1, 9, 4, 2, 3],
'col4': ['a', 'B', 'c', 'D', 'e', 'F']
})
label_encoder = preprocessing.LabelEncoder()
for col in e.columns:
if e[col].dtype == 'O':
e[col] = label_encoder.fit_transform(e[col])
print(e)
或者更好:
import pandas as pd
from sklearn import preprocessing
def encode_labels(ser):
if ser.dtype == 'O':
return label_encoder.fit_transform(ser)
else:
return ser
label_encoder = preprocessing.LabelEncoder()
e = pd.DataFrame({
'col1': ['A', 'A', 'B', 'W', 'F', 'C'],
'col2': [2, 1, 9, 8, 7, 4],
'col3': [0, 1, 9, 4, 2, 3],
'col4': ['a', 'B', 'c', 'D', 'e', 'F']
})
e_encoded = e.apply(encode_labels)
print(e_encoded)
过滤并使预处理适应列类型是正确的想法,最有效的方法是使用管道
from sklearn.compose import ColumnTransformer
from sklearn.compose import make_column_selector
from sklearn.preprocecssing import LabelEncoder, StandardScaler
示例1:根据列名应用转换器
示例2:根据列类型应用变压器
显然,用您选择的转换器替换LabelEncoder和StandardScaler,包括一个自定义转换器:
class MyCustomTransformer(BaseEstimator, TransformerMixin):
def __init__(self):
# do something
def fit(self, X, y = None):
# do something
return self
def transform(self, X, y = None):
# do something
# return something transformed
更进一步,我建议使用scikit学习管道根据列和/或列类型组合不同的预处理(这将更加灵活)
请参见此处的课程详细信息:
my_transformer2 = ColumnTransformer(
[
('transform_name_categories', LabelEncoder(), make_column_selector(dtype_include=object)),
('transformer_name_for_numerical', StandardScaler(), make_column_selector(dtype_include=np.number))
]
)
class MyCustomTransformer(BaseEstimator, TransformerMixin):
def __init__(self):
# do something
def fit(self, X, y = None):
# do something
return self
def transform(self, X, y = None):
# do something
# return something transformed