【问题标题】:How to convert nominal data to numeric in python?如何在python中将名义数据转换为数字?
【发布时间】:2021-08-04 05:05:21
【问题描述】:

我正在使用二进制分类数据集。我想将名义数据转换为数字。我该怎么办?

age | class
------------
 1 |  no
 2 |  yes
 3 |  no
 4 |  yes
 5 |  no
 6 |  no
 7 |  no
 8 |  yes
 9 |  no
10 |  y

代码:

mapping = {label:idx for idx,label in enumerate(np.unique(['class']))}
df['class'] = df['class'].map(mapping)

期望的输出:{'no':0 'yes':1}

【问题讨论】:

  • 第 10 行中的 y 应该是 yes 还是故意的?
  • @meowulf 这是故意的(例如它是嘈杂的数据)
  • df['class'] = df['class'].isin(['yes','y']).astype(int) 也应该可以工作

标签: python pandas data-mining enumerate data-preprocessing


【解决方案1】:

您的代码的问题是:

np.unique(['class'])

您正在尝试查找列表['class'] 的唯一值,这只是一个值,您应该将其更改为:

np.unique(df['class'])

其中包含 class 列的所有不同值

但在此之前,您应该将嘈杂的数据y 替换为yes

df['class'] = df['class'].replace('y', 'yes')

mapping 变量现在具有您想要的输出:

{'no':0 'yes':1}

完整代码:

import numpy as np 
import pandas as pd

df = pd.DataFrame(['no', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'y'],columns=['class'])

df['class'] = df['class'].replace('y', 'yes') # replace your noisy data
mapping = {label:idx for idx,label in enumerate(np.unique(df['class']))} # make your mapping dict
df['class'] = df['class'].map(mapping) # map your class

【讨论】:

  • 谢谢,它有效,但如果我有多个标称数据,我该怎么办?这段代码不起作用? mapping = {label:idx for idx,label in enumerate(np.unique(df['class','class2']))} df['class','class2'] = df['class','class2' ].map(映射)
  • 多名义数据是什么意思?你在说什么class2?请编辑您的帖子,让您的问题更清楚
  • 我有一个问题要问你,这是否只回答二进制变量?也就是说,如果我们有噪声数据,我必须先删除它,然后再这样做?
  • 这适用于多类,但是对于您的嘈杂数据,您应该先替换它们,请参阅我编辑的答案
  • @meowlf 如果我在数据集中有缺失值将其转换为数字,我该怎么办?
猜你喜欢
  • 2021-08-04
  • 2017-06-21
  • 1970-01-01
  • 2018-05-02
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-26
相关资源
最近更新 更多