我想发生以下事情:
对于df中的每一列,检查其类型是否为数字-如果不是,请使用标签编码器将str / obj映射到数字类(例如0、1、2、3 ...)。
我正在尝试通过以下方式进行操作:
with open('sys.argv', 'r') as maze:
print(maze.read())
我在这里看不到什么问题。
第一-列名可以重复,因此for col in df:
if not np.issubdtype(df[col].dtype, np.number):
df[col] = LabelEncoder().fit_transform(df[col])
返回多个列,这不是我想要的。
第二个-df[col]
引发错误:
df[col].dtype
我认为可能是由于问题#1引起的,例如,我们返回了多列。但是我不自信。
第三-分配AttributeError: 'DataFrame' object has no attribute 'dtype'
会导致df中的列替换,还是我应该进行一些深奥的df分区和串联?
谢谢
答案 0 :(得分:1)
由于LabelEncoder
一次仅支持一列,因此在列上进行迭代是您唯一的选择。您可以使用select_dtypes
选择列,然后使用df.apply
将LabelEncoder
应用于每一列,以使其更加简洁。
cols = df.select_dtypes(exclude=[np.number]).columns
df[cols] = df[cols].apply(lambda x: LabelEncoder().fit_transform(x))
或者,您可以仅通过选择对象dtypes来构建蒙版(有点片状但易于扩展):
m = df.dtypes == object
# m = [not np.issubdtype(d, np.number) for d in df.dtypes]
df.loc[:, m] = df.loc[:, m].apply(lambda x: LabelEncoder().fit_transform(x))