这个问题类似于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']]
显然,它很慢。有没有一种有效的方法来做到这一点?
一种方法是使用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]