在熊猫中进行一种单热编码的有效方法

时间:2017-12-29 10:27:12

标签: python pandas dataframe

此问题类似于this one,但有一点不同:此处不是单个值,而是在一列数据框中有一个值列表。

假设我们有一个pandas数据框,其中一列名为words。它包含文档中可用的单词索引。例如,在以下数据框中,有两个文档,其中第一个包含单词['a','b'],第二个包含['a','c','d']

df = pd.DataFrame()
df['words'] = [['a','b'],['a','c','d']]

我想将words列转换为不同的二进制列,每个单词一列。上述数据框将转换为:

df['a'] = [True, True]
df['b'] = [True, False]
df['c'] = [False, True]
df['d'] = [False, True]

目前,我有以下代码,它会迭代w列中提供的不同字words

df[w] = [w in word_list for word_list in df['words']]

显然,它很慢。有没有一种有效的方法呢?

1 个答案:

答案 0 :(得分:2)

一种方法是使用get_dummies

In [31]: pd.get_dummies(df.words.apply(pd.Series).stack()).sum(level=0).astype(bool)
Out[31]:
      a      b      c      d
0  True   True  False  False
1  True  False   True   True

另一种方式,假设您在字符串中没有|或使用任何其他分隔符

In [50]: df.words.str.join('|').str.get_dummies('|').astype(bool)
Out[50]:
      a      b      c      d
0  True   True  False  False
1  True  False   True   True

单值。

In [68]: df['a'] = df.words.apply(lambda x: 'a' in x)  # or ['a' in x for x in df.words]