我有如下字典,
{'A': 0, 'C': 0, 'B': 1, 'E': 3, 'D': 1, 'G': 0, 'F': 0, 'I': 3, 'H': 3, 'J': 1}
使用此字典,我要创建一个如下所示的熊猫数据框,
A B C D E F G H I J
0 1 0 1 0 0 1 1 0 0 0
1 0 1 0 1 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 1 0 0 1 1 0
上述字典的键-值对表示使用此值的列名-索引,我想创建一个如上所述的数据框。
例如'A': 0
代表索引值为0的列A应该为1。类似的'E': 3,
代表索引索引为3的列E应该为1。
到目前为止,我已经尝试过了
df=pd.DataFrame(index=range(max(my_dic.values())),columns=[req_cols])
for u,v in my_dic.items():
df.at[v,u]=1
print df.fillna(0)
以上代码可以正常工作,但是我认为这不是解决此问题的有效方法。有没有更好的有效方法来解决此问题?
任何帮助都是非常有意义的。
谢谢。
答案 0 :(得分:1)
这是一个简单的解决方案,但不一定是最快的解决方案。更快的解决方案可以使用更快的one_at_index
函数。 numpy
可以提供更快的方法。
d = {'A': 0, 'C': 0, 'B': 1, 'E': 3, 'D': 1, 'G': 0, 'F': 0, 'I': 3, 'H': 3, 'J': 1}
height = max(value for value in d.values())
def one_at_index(index, height):
return [0]*index + [1] + [0]*(height - index)
result = pd.DataFrame({key: one_at_index(value, height) for key, value in d.items()})
print(result)
Out:
A C B E D G F I H J
0 1 1 0 0 0 1 1 0 0 0
1 0 0 1 0 1 0 0 0 0 1
2 0 0 0 0 0 0 0 0 0 0
3 0 0 0 1 0 0 0 1 1 0
如果您对列顺序很重要,只需将columns=list("ABCDEFGHIJ")
或等效项添加到pd.DataFrame
调用中即可。
答案 1 :(得分:1)
sklearn
库提供了没有显式循环的解决方案。
from sklearn.preprocessing import MultiLabelBinarizer
d = {'A': 0, 'C': 0, 'B': 1, 'E': 3, 'D': 1, 'G': 0, 'F': 0, 'I': 3, 'H': 3, 'J': 1}
mlb = MultiLabelBinarizer()
s = pd.DataFrame(list(d.items())).groupby(1)[0].apply(list).rename_axis(None)
res = pd.DataFrame(mlb.fit_transform(s), columns=mlb.classes_, index=s.index)\
.reindex(range(s.index.max()+1)).fillna(0).astype(int)
print(res)
A B C D E F G H I J
0 1 0 1 0 0 1 1 0 0 0
1 0 1 0 1 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 1 0 0 1 1 0