我正在尝试将一些object
列转换为分类列。以下是df
CODE ZONE ZCLA AMNT
1001 EC M 200
1002 NW G 100
1003 SE N 150
1004 SC G 200
1005 EC M 100
因此,应对列ZONE
和ZCLA
进行编码,生成的数据帧将如下所示
CODE ZONE ZCLA AMNT
1001 0 0 200
1002 1 1 100
1003 2 2 150
1004 3 0 200
1005 0 1 100
我正在遵循三种方法来实现相同的目标。
方法1:
for cl in df.select_dtypes(include=['object']):
df[cl],_ = pd.factorize(df[cl])
方法2:
for cl in df.select_dtypes(include=['object']):
df[cl] = df[cl].astype('category')
df[cl] = df[cl].apply(lambda x : x.cat.codes)
方法3:
le=LabelEncoder()
for cl in df.select_dtypes(include=['object']):
df[cl] = df[cl].astype('category')
df[cl] = df[cl].apply(le.fit_transform())
方法 1 是创建一个我不想要的标签 -1。
方法 2 给了我一个错误:AttributeError: 'str' object has no attribute 'cat'
方法 3 给出错误:AttributeError: 'str' object has no attribute 'astype'
任何人都可以对此有所了解吗?我错过了什么吗?
嗨,我可以尝试分享我在遇到相同问题时获得的一些见解。 我发现要运行 lambda 函数lambda x : x.cat.codes
即使它是类别 dtypes,您也无法直接选择列。
选择带有cat_columns = df.select_dtypes(['category']).columns
列的方法
遵循我的实现。
df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'), 'col3':list('ababb')})
def __pd_to_cat_trans(df, column_name):
print("Create the Label DataFrame")
df[column_name] = df[column_name].astype('category')
df_label = pd.DataFrame()
df_label['Label'] = df[column_name]
df_label['Cat_value'] = df[column_name].cat.codes
print("Transform the column {} to a categorical value".format(column_name))
df[column_name] = df[column_name].astype('category')
cat_columns = df.select_dtypes(['category']).columns
df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)
return df, df_label
orig_df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'), 'col3':list('ababb')})
a, b = __pd_to_cat_trans(orig_df, 'col2')
print(orig_df, "n", a,"n", b)
Create the Label DataFrame
Transform the column col2 to a categorical value
col1 col2 col3
0 1 a a
1 2 b b
2 3 c a
3 4 a b
4 5 b b
col1 col2 col3
0 1 0 a
1 2 1 b
2 3 2 a
3 4 0 b
4 5 1 b
Label Cat_value
0 a 0
1 b 1
2 c 2
3 a 0
4 b 1
可以找到相关问题 在熊猫数据帧中转换分类数据