在python中解决pd.get_假人功能失调
我有在python中解决pd.get_假人功能失调,python,pandas,dummy-variable,Python,Pandas,Dummy Variable,我有 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:
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
有人能解释一下我做错了什么吗?类似这样的事情吗
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
选项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
您期望的输出是什么样子的?因为
b.apply(pd.Series)[0]
生成了一个包含两列的数据帧。输出将有列columnname\u dummyvalue
您可能正在查找的pd.Series([v代表x,b代表v代表x])。str.get\u dummies()
?两个键在列表中有两个值(11和15)@JohnGalt ok;谢谢,所以问题不是来自get_假人,而是来自系列,但问题是为什么?它应该只是将列表转换为系列。我只执行转换,因此可以输入以获取虚拟对象,它不接受列表。我试试你提议的表达方式。实际上,我只希望本专栏的“单元格”包含系列而不是列表,因为这是唯一阻止get_Dummie工作的东西。亚历山大,你说得对,我会编辑OP(但这不会改变pb)。Scott:我希望复制列的1在同一列中处于同一级别。谢谢,我不知道第一列,因此它基本上与get_dummies(但效果更好?;)相同。至于第二列,如果我理解清楚,它将在管道周围的字符串中连接每个列表元素。但我不明白它是如何让get_假人工作得更好的?既然现在每个单元格只有一个字符串,那么该方法如何“得到”必须拆分该字符串?在这种情况下,它像正则表达式一样工作?我没有注意到这种行为。在将对象作为参数传递时修改对象,然后在同一函数调用中使用修改后的对象属性,这是一种糟糕的做法。另外,我会为dataframe构造函数命名参数。这很奇怪,我尝试了这个方法,但是堆栈失败了,使用相同的值,它们没有被分开并保持在同一行中…实际上,我也没有求和,输出是相同的,只有不同顺序的标签。。。但是列是相同的,并且都有前缀。