重构Pandas中的数据进行一次热编码?

时间:2017-02-28 21:41:49

标签: python pandas one-hot-encoding

这是我多次潜伏和阅读帖子后第一次询问Stack Overflow问题。

我一直在处理无头的CSV数据集,如下所示:

list-of-things-that-are-present-in-this-entry, Yes
list-of-things-that-are-present-in-this-entry, No

每个数据集的大小范围从~30KB到~100MB。

现在,就值的数量而言,每个条目的长度都不同。当我用Pandas读取CSV文件时,它一直在为我调整条目 - 但不是以我想要的方式。

让我们说第二个条目是两者中较短的一个。 Pandas一直用NaN填充剩下的行,所以它与其他条目的长度相同。

list-of-things-that-are-present-in-this-entry, Yes
list-of-things-that-are-present-in-this-entry, No, NaN, NaN

问题是,这会抛弃到目前为止我尝试使用的get_dummies函数。 '是'和'不'值适用于同一属性。通过"抛出",我的意思是它已经将每列值视为同一属性(例如,是和NaN,当它应该是Yes和No进行比较时)。

关于我能做什么的任何建议?也许在标题上?我想要的基本上是这样的:

    A B C D E F isThingTrue?
0   0 1 0 1 0 0     0
1   1 0 1 0 0 0     1
2   0 1 1 1 0 1     1

来自:

B, D, No
A, C, Yes
B, C, D, F, Yes

文件本身看起来像这样:

A, B, C, D, E, F, isThingTrue?
0, 1, 0, 1, 0, 0, 0
1, 0, 1, 0, 0, 0, 1
0, 1, 1, 1, 0, 1, 1
我不会和熊猫或其他任何人结婚;在搜索了一百五十个兔子搜索查询之后,我一直在绝望地问道。这是我第一次尝试数据修改和Python。如果我做错了,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以使用scikit-learn CountVectorizer,您需要覆盖令牌模式,因为默认情况下它只捕获2个或更多字符的单词。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

s = """B, D, No
       A, C, Yes
       B, C, D, F, Yes"""

c = CountVectorizer(token_pattern='\w+')
values = c.fit_transform(s.split('\n'))

pd.DataFrame(values.toarray(), columns=c.vocabulary_)
   a  d  c  yes  f  b  no
0  0  1  0    1  0  1   0
1  1  0  1    0  0  0   1
2  0  1  1    1  1  0   1

您的数据格式并非真的是CSV,因此大熊猫可能不是阅读它的最佳方式,最好只将其作为文本文件阅读。