【问题标题】:Converting categorical values to binary using pandas使用 pandas 将分类值转换为二进制
【发布时间】:2015-09-04 00:03:46
【问题描述】:

我正在尝试使用 pandas 将分类值转换为二进制值。这个想法是将每个唯一的分类值视为一个特征(即一列),并根据是否将特定对象(即行)分配给该类别来放置 1 或 0。以下是代码:

data = pd.read_csv('somedata.csv')
converted_val = data.T.to_dict().values()
vectorizer = DV( sparse = False )
vec_x = vectorizer.fit_transform( converted_val )
numpy.savetxt('out.csv',vec_x,fmt='%10.0f',delimiter=',')

我的问题是,如何用列名保存转换后的数据?。在上面的代码中,我可以使用numpy.savetxt 函数保存数据,但这只是保存了数组并且列名丢失了。或者,是否有一种更有效的方法来执行上述操作?

【问题讨论】:

  • 也许 pd.data.to_csv() 会更好。它有一个接受序列的列参数,默认为无。

标签: python numpy pandas type-conversion categorical-data


【解决方案1】:

你的意思是“one-hot”编码?

假设您有以下数据集:

import pandas as pd
df = pd.DataFrame([
            ['green', 1, 10.1, 0], 
            ['red', 2, 13.5, 1], 
            ['blue', 3, 15.3, 0]])

df.columns = ['color', 'size', 'prize', 'class label']
df

现在,您有多种选择...

A) 繁琐的方法

color_mapping = {
           'green': (0,0,1),
           'red': (0,1,0),
           'blue': (1,0,0)}

df['color'] = df['color'].map(color_mapping)
df

import numpy as np
y = df['class label'].values
X = df.iloc[:, :-1].values
X = np.apply_along_axis(func1d= lambda x: np.array(list(x[0]) + list(x[1:])), axis=1, arr=X)

print('Class labels:', y)
print('\nFeatures:\n', X)

产量:

Class labels: [0 1 0]

Features:
 [[  0.    0.    1.    1.   10.1]
 [  0.    1.    0.    2.   13.5]
 [  1.    0.    0.    3.   15.3]]

B) Scikit-learn 的 DictVectorizer

from sklearn.feature_extraction import DictVectorizer
dvec = DictVectorizer(sparse=False)

X = dvec.fit_transform(df.transpose().to_dict().values())
X

产量:

array([[  0. ,   0. ,   1. ,   0. ,  10.1,   1. ],
       [  1. ,   0. ,   0. ,   1. ,  13.5,   2. ],
       [  0. ,   1. ,   0. ,   0. ,  15.3,   3. ]])

C) 熊猫的get_dummies

pd.get_dummies(df)

【讨论】:

  • 感谢您的详细解释。假人正是我要找的。​​span>
【解决方案2】:

您似乎正在使用 scikit-learn 的 DictVectorizer 将分类值转换为二进制。在这种情况下,要将结果与新列名一起存储,您可以使用来自vec_x 的值和来自DV.get_feature_names() 的列构造一个新的DataFrame。然后,将 DataFrame 存储到磁盘(例如使用 to_csv())而不是 numpy 数组。

或者,也可以使用pandas直接通过get_dummies函数进行编码:

import pandas as pd
data = pd.DataFrame({'T': ['A', 'B', 'C', 'D', 'E']})
res = pd.get_dummies(data)
res.to_csv('output.csv')
print res

输出:

   T_A  T_B  T_C  T_D  T_E
0    1    0    0    0    0
1    0    1    0    0    0
2    0    0    1    0    0
3    0    0    0    1    0
4    0    0    0    0    1

【讨论】:

  • 通常你会有二进制变量或有一些预先确定的可能值集(如 A、B、C、D、E),在这种情况下你可能想要删除其中一个变量,如 A在这个例子中,因为其他 4 个类别的信息足以唯一标识每个项目:项目 0 将存储为 [-,0,0,0,0],告诉您该项目必须属于 A。如何做到这一点:pd.get_dummies(data, drop_first=True)
猜你喜欢
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2020-10-04
  • 1970-01-01
  • 2017-07-15
  • 2021-03-06
  • 2020-07-15
  • 1970-01-01
相关资源
最近更新 更多