在python3.x中考虑以下字典词典
dict1 = {4: {4:25, 5:39, 3:42}, 5:{24:94, 252:49, 25:4, 55:923}}
我想将其展开为pandas DataFrame。似乎有两个选择:
df1 = pd.DataFrame.from_dict(dict1, orient='columns')
print(df1)
4 5
3 42.0 NaN
4 25.0 NaN
5 39.0 NaN
24 NaN 94.0
25 NaN 4.0
55 NaN 923.0
252 NaN 49.0
其中的列是主字典键4
和'5',行索引是子字典键,值是子字典值。
另一个选项是
df2 = pd.DataFrame.from_dict(dict1, orient='index')
print(df2)
4 5 3 24 252 25 55
4 25.0 39.0 42.0 NaN NaN NaN NaN
5 NaN NaN NaN 94.0 49.0 4.0 923.0
其中,列是内部“子词典”的键,行索引是主词典的键,值是子词典的键。
有没有一种标准的方法可以让我们按照以下方式展开python字典?
key inner_key values
4 3 42
4 4 25
4 5 39
5 24 94
5 25 4
5 55 923
5 252 49
最好不要在使用from_dict()
之后再操作DataFrame,因为对于更大的python字典,这可能会占用大量内存。
答案 0 :(得分:2)
列表理解应该相当有效:
time.Duration
pd.melt
+ dropna
如果您不介意从dict1 = {4: {4:25, 5:39, 3:42}, 5: {24:94, 252:49, 25:4, 55:923}}
cols = ['key', 'inner_key', 'values']
df = pd.DataFrame([[k1, k2, v2] for k1, v1 in dict1.items() for k2, v2 in v1.items()],
columns=cols).sort_values(cols)
print(df)
key inner_key values
2 4 3 42
0 4 4 25
1 4 5 39
3 5 24 94
5 5 25 4
6 5 55 923
4 5 252 49
开始工作,则可以通过df1
取消数据框的位置,然后删除具有空pd.melt
的行。
value
答案 1 :(得分:1)
pd.DataFrame([[i,j,user_dict[i][j] ] for i in user_dict.keys() for j in user_dict[i].keys()],columns=['key', 'inner_key', 'values'])
输出:
key inner_key values
0 4 4 25
1 4 5 39
2 4 3 42
3 5 24 94
4 5 252 49
5 5 25 4
6 5 55 923