Python 将非唯一列表的列转换为具有填充项的列名
我有一个数据框Python 将非唯一列表的列转换为具有填充项的列名,python,pandas,Python,Pandas,我有一个数据框数据: import pandas as pd data = pd.DataFrame({"col1" : ['1_xy','2_xy','3_xy','4_xy','5_xy'], "col2" : [['a', 'b', 'c'], ['d', 'e', 'f', 'g', 'h', 'i'], ['a',
数据:
import pandas as pd
data = pd.DataFrame({"col1" : ['1_xy','2_xy','3_xy','4_xy','5_xy'],
"col2" : [['a', 'b', 'c'],
['d', 'e', 'f', 'g', 'h', 'i'],
['a', 'j', 'k'],
['a', 'b', 'd'],
['a', 'l', 'm']]})
输出:
col1 col2
0 1_xy [a, b, c]
1 2_xy [d, e, f, g, h, i]
2 3_xy [a, j, k]
3 4_xy [a, b, d]
4 5_xy [a, l, m]
col1 a b c d e f g h i j k l m
0 1_xy 1 1 1 0 0 0 0 0 0 0 0 0 0
1 2_xy 0 0 0 1 1 1 1 1 1 0 0 0 0
2 3_xy 1 0 0 0 0 0 0 0 0 1 1 0 0
3 4_xy 1 1 0 1 0 0 0 0 0 0 0 0 0
4 5_xy 1 0 0 0 0 0 0 0 0 0 0 1 1
我正在尝试将此数据帧转换为如下所示的数据帧:
import re
new_data = pd.DataFrame({'col1': ['1_xy','2_xy','3_xy','4_xy','5_xy'],
'a' : [1,0,1,1,1], 'b' : [1,0,0,1,0],
'c' : [1,0,0,0,0], 'd' : [0,1,0,1,0],
'e' : [0,1,0,0,0], 'f' : [0,1,0,0,0],
'g' : [0,1,0,0,0], 'h' : [0,1,0,0,0],
'i' : [0,1,0,0,0], 'j' : [0,0,1,0,0],
'k' : [0,0,1,0,0], 'l' : [0,0,0,0,1],
'm' : [0,0,0,0,1]})
new_data[["col1"] + [name for name in new_data.columns if not re.search("col1", name)]]
输出:
col1 col2
0 1_xy [a, b, c]
1 2_xy [d, e, f, g, h, i]
2 3_xy [a, j, k]
3 4_xy [a, b, d]
4 5_xy [a, l, m]
col1 a b c d e f g h i j k l m
0 1_xy 1 1 1 0 0 0 0 0 0 0 0 0 0
1 2_xy 0 0 0 1 1 1 1 1 1 0 0 0 0
2 3_xy 1 0 0 0 0 0 0 0 0 1 1 0 0
3 4_xy 1 1 0 1 0 0 0 0 0 0 0 0 0
4 5_xy 1 0 0 0 0 0 0 0 0 0 0 1 1
i、 e.新数据框的列由data.col2
列表中的唯一值组成,值由列表中某个条目对应的值填充
到目前为止,我一直在玩弄pandas.get_dummies
,但它创建了我无法控制的虚假列
我试图对其执行此操作的实际数据非常高(许多行),因此内存“可能”是一个问题,但欢迎所有解决方案。我应该补充一点,我已经准备好了一个变通方法,它使用字典方法——但不幸的是,它非常缓慢。希望任何人以前见过这个问题,可以提供帮助
我目前正在使用python v3.4和pandas v0.14.1(我知道…您可以尝试获取虚拟对象,方法是使用参数以获得正确的列名称:
df = pd.get_dummies(data.col2.apply(pd.Series), prefix='', prefix_sep='')
pd.concat([data['col1'], df], axis=1)
Out[31]:
col1 a d b e j l c d f k m g h i
0 1_xy 1 0 1 0 0 0 1 0 0 0 0 0 0 0
1 2_xy 0 1 0 1 0 0 0 0 1 0 0 1 1 1
2 3_xy 1 0 0 0 1 0 0 0 0 1 0 0 0 0
3 4_xy 1 0 1 0 0 0 0 1 0 0 0 0 0 0
4 5_xy 1 0 0 0 0 1 0 0 0 0 1 0 0 0
如何使用
get_dummies
?@IanS我是这样使用的:df=data[“col2”].str.get_dummies(sep=“,”),有时它似乎可以工作,但我一直发现重复的列甚至彼此不匹配(我认为这是应该的,我使用的命令是错误的)我应该注意到,我还没有在我的玩具示例上尝试过这个命令。谢谢你的建议,但是当我尝试它时,它会抛出ValueError异常。您使用的是哪个版本的pandas?版本0.15.2,是在应用或获取虚拟机上出现问题吗?“应用”对我来说很有效(我自己最近一直遵循这条路径,它返回了一些有希望的结果。)是获取虚拟机抛出了异常。我得到:“TypeError:'numpy.int64'对象不可编辑”。我想我可能不得不玩弄类型——或者我弄错了吗?我还应该说我也得到了以下信息:“ValueError:无法将输入数组从形状(5,6)广播到形状(5)”我切换到了另一个版本的pandas(0.16.2),然后它对我起了作用。这似乎是熊猫的版本特定问题。我不确定是否接受你的答案,即使它确实适用于更成熟版本的熊猫。我自己的想法倾向于是的。。。