【问题标题】:Solving pd.get_dummies dysfunction in python解决python中的pd.get_dummies功能障碍
【发布时间】:2018-02-24 23:22:20
【问题描述】:

我有

 a={0: ['I3925'], 1: ['I3925'], 2: ['I3925'], 3: ['I2355'], 4: ['I2355'], 5: ['I2355'], 6: ['I111'], 7: ['I111'], 8: ['I111'], 9: ['I405'], 10: ['I405'], 11: ['I3878', 'I2864'], 12: ['I3878'], 13: ['I534'], 14: ['I534'], 15: ['I134', 'I2276'], 16: ['I107'], 17: ['I107'], 18: ['I2864']}  

其中包含一个用于一个键的补充 I 编号。

b = pd.Series(a,\
                              index = a.keys(),
                               name = "a")
pd.get_dummies(b.apply(pd.Series))

然后 get_dummies 不起作用,因为它会创建一个重复的列 1_15 来存储与第二个 I 编号的匹配项,而不是将它们堆叠到同一列中。我不明白为什么。

    0_I107  0_I111  0_I134  0_I2355 0_I2864 0_I3878 0_I3925 0_I405  0_I534  1_I2276 1_I2864
0   0   0   0   0   0   0   1   0   0   0   0
1   0   0   0   0   0   0   1   0   0   0   0
2   0   0   0   0   0   0   1   0   0   0   0
3   0   0   0   1   0   0   0   0   0   0   0
4   0   0   0   1   0   0   0   0   0   0   0
5   0   0   0   1   0   0   0   0   0   0   0
6   0   1   0   0   0   0   0   0   0   0   0
7   0   1   0   0   0   0   0   0   0   0   0
8   0   1   0   0   0   0   0   0   0   0   0
9   0   0   0   0   0   0   0   1   0   0   0
10  0   0   0   0   0   0   0   1   0   0   0
11  0   0   0   0   0   1   0   0   0   0   1
12  0   0   0   0   0   1   0   0   0   0   0
13  0   0   0   0   0   0   0   0   1   0   0
14  0   0   0   0   0   0   0   0   1   0   0
15  0   0   1   0   0   0   0   0   0   1   0
16  1   0   0   0   0   0   0   0   0   0   0
17  1   0   0   0   0   0   0   0   0   0   0
18  0   0   0   0   1   0   0   0   0   0   0

谁能解释一下我做错了什么?

【问题讨论】:

  • 您的预期输出是什么样的?
  • 因为b.apply(pd.Series)[0] 生成了一个包含两列的数据框。输出将有列columnname_dummyvalue
  • 您可能正在寻找pd.Series([v for x in b for v in x]).str.get_dummies()
  • 两个键在列表中有两个值(11 & 15)
  • @JohnGalt 好的;谢谢,所以问题不是来自 get_dummies 而是来自系列,但问题是为什么?它应该只将列表转换为系列。我只执行转换,因此可以输入 get_dummies,它不接受列表。我会尝试你提出的表达方式。我实际上只是希望此列的“单元格”包含系列而不是列表,因为它是唯一阻止 get_dummies 工作的东西。亚历山大,你是对的,我将编辑 OP(但这不会改变 pb)。 Scott:我希望重复列的 1 在同一列中处于同一级别。

标签: python pandas dummy-variable


【解决方案1】:

选项 1

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
pd.DataFrame(mlb.fit_transform(b), b.index, mlb.classes_)

    I107  I111  I134  I2276  I2355  I2864  I3878  I3925  I405  I534
0      0     0     0      0      0      0      0      1     0     0
1      0     0     0      0      0      0      0      1     0     0
2      0     0     0      0      0      0      0      1     0     0
3      0     0     0      0      1      0      0      0     0     0
4      0     0     0      0      1      0      0      0     0     0
5      0     0     0      0      1      0      0      0     0     0
6      0     1     0      0      0      0      0      0     0     0
7      0     1     0      0      0      0      0      0     0     0
8      0     1     0      0      0      0      0      0     0     0
9      0     0     0      0      0      0      0      0     1     0
10     0     0     0      0      0      0      0      0     1     0
11     0     0     0      0      0      1      1      0     0     0
12     0     0     0      0      0      0      1      0     0     0
13     0     0     0      0      0      0      0      0     0     1
14     0     0     0      0      0      0      0      0     0     1
15     0     0     1      1      0      0      0      0     0     0
16     1     0     0      0      0      0      0      0     0     0
17     1     0     0      0      0      0      0      0     0     0
18     0     0     0      0      0      1      0      0     0     0

选项 2

b.str.join('|').str.get_dummies()

    I107  I111  I134  I2276  I2355  I2864  I3878  I3925  I405  I534
0      0     0     0      0      0      0      0      1     0     0
1      0     0     0      0      0      0      0      1     0     0
2      0     0     0      0      0      0      0      1     0     0
3      0     0     0      0      1      0      0      0     0     0
4      0     0     0      0      1      0      0      0     0     0
5      0     0     0      0      1      0      0      0     0     0
6      0     1     0      0      0      0      0      0     0     0
7      0     1     0      0      0      0      0      0     0     0
8      0     1     0      0      0      0      0      0     0     0
9      0     0     0      0      0      0      0      0     1     0
10     0     0     0      0      0      0      0      0     1     0
11     0     0     0      0      0      1      1      0     0     0
12     0     0     0      0      0      0      1      0     0     0
13     0     0     0      0      0      0      0      0     0     1
14     0     0     0      0      0      0      0      0     0     1
15     0     0     1      1      0      0      0      0     0     0
16     1     0     0      0      0      0      0      0     0     0
17     1     0     0      0      0      0      0      0     0     0
18     0     0     0      0      0      1      0      0     0     0

【讨论】:

  • 谢谢我不知道第一个,因此它基本上与 get_dummies 相同(但效果更好?;)) 至于第二个,如果我理解得很好,它将加入每个列表元素在管子周围的一根绳子里。但我不明白它如何让 get_dummies 更好地工作?由于现在每个单元格只有一个字符串,方法如何“获取”它必须拆分字符串?在这种情况下它像正则表达式一样工作吗?我不知道这种行为。
  • 在将对象作为参数传递时修改对象然后在同一个函数调用中使用修改后的对象属性是不好的做法。另外,我会命名数据框构造函数的参数。
【解决方案2】:

这样的?

pd.get_dummies(b.apply(pd.Series).stack()).sum(level=0)

输出:

    I107  I111  I134  I2276  I2355  I2864  I3878  I3925  I405  I534
0      0     0     0      0      0      0      0      1     0     0
1      0     0     0      0      0      0      0      1     0     0
2      0     0     0      0      0      0      0      1     0     0
3      0     0     0      0      1      0      0      0     0     0
4      0     0     0      0      1      0      0      0     0     0
5      0     0     0      0      1      0      0      0     0     0
6      0     1     0      0      0      0      0      0     0     0
7      0     1     0      0      0      0      0      0     0     0
8      0     1     0      0      0      0      0      0     0     0
9      0     0     0      0      0      0      0      0     1     0
10     0     0     0      0      0      0      0      0     1     0
11     0     0     0      0      0      1      1      0     0     0
12     0     0     0      0      0      0      1      0     0     0
13     0     0     0      0      0      0      0      0     0     1
14     0     0     0      0      0      0      0      0     0     1
15     0     0     1      1      0      0      0      0     0     0
16     1     0     0      0      0      0      0      0     0     0
17     1     0     0      0      0      0      0      0     0     0
18     0     0     0      0      0      1      0      0     0     0

【讨论】:

  • 这很奇怪,我试过了,但堆栈以相同的值失败,它们没有分开并保持在同一行......
  • 其实我也是这样做的,没有 sum 并且输出是一样的,只是标签的顺序不同......但是列是相同的,并且都有前缀。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 2021-05-29
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-06
相关资源
最近更新 更多