【问题标题】:How to one-hot-encode from a csv file input如何从 csv 文件输入中进行一次热编码
【发布时间】:2017-01-10 12:22:10
【问题描述】:

我有一个读取的 csv 文件

import pandas
df = pd.read_csv("inputfile")

有些列是数字,有些是字符串。让我们调用其中一个数字列'num' 和一个字符串'col'。我想做以下事情:

  1. 我希望能够对一个名为 'col' 的字符串列进行一次热编码,并生成一个包含所有特征的稀疏矩阵。
  2. 我想对df['num'] 进行一次热编码,但仅限于df['num'] < 100

如果输入在字典列表中,这很容易做到。

步骤 1. 在您运行 DictVectorizer 时自动发生

第 2 步。 只需要我在必要时迭代字典,为新的字符串功能 'num_cat' 添加键/值对,然后在整个新字典列表上运行 DictVectorizer。

我坚持以下:

  • 我需要由 one-hot-encoding 产生的矩阵是稀疏的。如果有大量类别,pd.get_dummies 会非常非常慢。它会创建一个密集矩阵然后使其稀疏吗?因此,我觉得我无法使用它。
  • 我可以在不先将数据框转换为字典列表然后运行 ​​DictVectorizer 的情况下执行我需要的操作吗?如果没有,是否有一种简单的方法来进行转换?

【问题讨论】:

标签: python csv pandas scikit-learn


【解决方案1】:

假设你开始

In [31]: df = pd.DataFrame({'col': ['foo', 'foo', 'bar', 'bar'], 'num': [1, 1, 3, 213]})

In [32]: df
Out[32]: 
   col  num
0  foo    1
1  foo    1
2  bar    3
3  bar  213

首先,让我们照顾col

如果我们定义

In [33]: d = dict([e[:: -1] for e in enumerate(df.col.unique())])

然后我们可以用它来“数字化”col

In [34]: df.col = df.col.map(d)

In [35]: df
Out[35]: 
   col  num
0    0    1
1    0    1
2    1    3
3    1  213

现在让我们处理num

In [36]: import numpy as np

我们将把所有超过 100 的东西变成 100:

In [37]: df.num = np.minimum(df.num.values, 100)

In [38]: df
Out[38]: 
   col  num
0    0    1
1    0    1
2    1    3
3    1  100

现在开始编码:

In [49]: from sklearn import preprocessing

In [50]: enc = preprocessing.OneHotEncoder()

In [51]: enc.fit(df.as_matrix()).transform(df.as_matrix()).toarray()
Out[51]: 
array([[ 1.,  0.,  1.,  0.,  0.],
       [ 1.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  1.]])

需要注意的两点:

  1. toarray() 使矩阵再次稠密;当然,它的使用是可选的。

  2. 通过构造,最后一列必然是num 的“100 及以上”类别。您可以根据需要保留或删除此列。

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 2022-09-27
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2023-03-05
    相关资源
    最近更新 更多