如何从Pandas数据框中对多值分类变量进行二进制编码?


9

假设我们具有以下数据框,其中特定列具有多个值:

    categories
0 - ["A", "B"]
1 - ["B", "C", "D"]
2 - ["B", "D"]

我们如何获得这样的桌子?

   "A"  "B"  "C"  "D"
0 - 1    1    0    0
1 - 0    1    1    1
2 - 0    1    0    1

注意:我不一定需要新的数据框,我想知道如何将此类数据框转换为更适合机器学习的格式。

Answers:


7

如果[0, 1, 2]是数字标签而不是索引,则pandas.DataFrame.pivot_table可以:

在[]中:
数据= pd.DataFrame.from_records(
    [[0,'A'],[0,'B'],[1,'B'],[1,'C'],[1,'D'],[2,'B'],[ 2,'D']],
    column = ['number_label','category'])
data.pivot_table(index = ['number_label'],列= ['category'],aggfunc = [len],fill_value = 0)
出[]:
              伦
类别ABCD
number_label                       
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

这篇博客文章很有帮助:http : //pbpython.com/pandas-pivot-table-explained.html


如果[0, 1, 2]是索引,则collections.Counter很有用:

在[]中:
data2 = pd.DataFrame.from_dict(
    {'categories':{0:['A','B'],1:['B','C','D'],2:['B','D']}}))
data3 = data2 ['categories']。apply(collections.Counter)
pd.DataFrame.from_records(data3).fillna(value = 0)
出[]:
       A B C D
0 1 1 0 0
1 0 1 1 1
2 0 1 0 1

谢谢,我会检查一下。实际上,0、1和2是索引。另外,您是否知道由于存在很多零,如何在这里有效地处理稀疏性?
丹尼斯·L

pandas和scipy都具有稀疏的数据结构(pandas sparsescipy sparse)以节省内存,但是您使用的机器学习库可能不支持它们。如果问题的维数(列数)太大,以至于需要稀疏表示,那么您可能还需要考虑使用降维技术
塞缪尔·哈罗德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.