如何优雅地对熊猫中的一系列列表进行热编码[重复]
Posted
技术标签:
【中文标题】如何优雅地对熊猫中的一系列列表进行热编码[重复]【英文标题】:How to elegantly one hot encode a series of lists in pandas [duplicate] 【发布时间】:2019-02-10 20:02:30 【问题描述】:所以我有以下数据:
>>> test = pd.Series([['a', 'b', 'e'], ['c', 'a'], ['d'], ['d'], ['e']])
>>> test
0 [a, b, e]
1 [c, a]
2 [d]
3 [d]
4 [e]
我正在尝试将列表中的所有数据一次性编码回我的数据框中。看起来像这样:
>>> pd.DataFrame([[1, 1, 0, 0, 1], [1, 0, 1, 0, 0],
[0, 0, 0, 1, 0], [0, 0, 0, 1, 0],
[0, 0, 0, 0, 1]],
columns = ['a', 'b', 'c', 'd', 'e'])
a b c d e
0 1 1 0 0 1
1 1 0 1 0 0
2 0 0 0 1 0
3 0 0 0 1 0
4 0 0 0 0 1
我尝试过研究,发现了类似的问题,但没有一个像这样。我尝试过:
test.apply(pd.Series)
但这并不能完全实现单热方面。这只是以任意顺序打开我的列表。我确信我可以找到一个冗长的解决方案,但我很高兴听到是否有更优雅的方式来执行此操作。
谢谢!
编辑:我知道我可以遍历我的test
系列,然后为找到的每个唯一值创建一个列,然后返回并再次遍历test
,标记所述列为独特的价值。但这对我来说似乎不是很讨人喜欢,我相信有一种更优雅的方式来做到这一点。
【问题讨论】:
Scikit 即将获得升级后的 onehotencoder,它将对字符串进行编码,FWIW:medium.com/dunder-data/… 【参考方案1】:sklearn
库中的MultiLabelBinarizer
对于这些问题更有效。它应该优先于apply
和pd.Series
。这是一个演示:
import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer
test = pd.Series([['a', 'b', 'e'], ['c', 'a'], ['d'], ['d'], ['e']])
mlb = MultiLabelBinarizer()
res = pd.DataFrame(mlb.fit_transform(test),
columns=mlb.classes_,
index=test.index)
结果
a b c d e
0 1 1 0 0 1
1 1 0 1 0 0
2 0 0 0 1 0
3 0 0 0 1 0
4 0 0 0 0 1
【讨论】:
如果在熊猫pd.DataFrame(test.values.tolist()).stack().str.get_dummies().sum(level=0)
@Wen,是的,很好。说起来很丢脸,但我从来没有在概念上欣赏过stack
,因此很少使用它。似乎也是效率的薄弱环节。
那就别用了 :-) pd.get_dummies(pd.DataFrame(test.values.tolist()),prefix_sep ='',prefix='').sum(level=0, axis = 1)
我不知道这个工具,我猜我的谷歌搜索词不够好,无法找到它。太棒了。谢谢!
请注意:使用 MultiLabelBinarizer 比 stack().str.get_dummies.sum()
方法快几倍。以上是关于如何优雅地对熊猫中的一系列列表进行热编码[重复]的主要内容,如果未能解决你的问题,请参考以下文章