从简单字典创建数据框

时间:2018-09-11 11:19:12

标签: python pandas

我有如下字典,

{'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)

以上代码可以正常工作,但是我认为这不是解决此问题的有效方法。有没有更好的有效方法来解决此问题?

任何帮助都是非常有意义的。

谢谢。

2 个答案:

答案 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