从简单字典创建数据帧

2024-03-29 02:17:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本下面这样的字典

{'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应该是一个类似的'E': 3,表示第3个索引值处的列E应该是一个

到目前为止我试过这个

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)

上面的代码工作得很好,但我认为这不是解决这个问题的有效方法。有没有更好的有效方法来解决这个问题

任何帮助都是值得赞赏的

提前谢谢


Tags: columns数据方法dataframedfindex字典my
2条回答

这里有一个简单的解决方案,但不一定是最快的。更快的解决方案可以使用更快的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调用

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

相关问题 更多 >