我有一个python字典如下:
dict1={808: [['a', 5.4, 'b'],
['c', 4.1 , 'b'],
['d', 3.7 , 'f']]}
我想将其转换为数据框,如下所示:
memberid userid score related
808 a 5.4 b
808 c 4.1 b
808 d 3.7 f
我尝试使用以下代码:
df=pd.DataFrame.from_dict(dict1,orient='index')
结果不是我想要的。
有人知道如何解决这个问题吗? 谢谢!
答案 0 :(得分:5)
让我们将每个嵌套列表值转换为DataFrame,然后调用pd.concat
。
columns = ['userid', 'score', 'related']
df_dict = {k : pd.DataFrame(v, columns=columns) for k, v in dict1.items()}
df = (pd.concat(df_dict)
.reset_index(level=1, drop=True)
.rename_axis('memberid')
.reset_index()
)
或者,以类似的方式 -
df = pd.concat([
pd.DataFrame(v, columns=columns, index=np.repeat(k, len(v)))
for k, v in dict1.items()
]
).rename_axis('memberid').reset_index()
df
memberid userid score related
0 808 a 5.4 b
1 808 c 4.1 b
2 808 d 3.7 f
重要提示 - 此解决方案 适用于多个键值对,其中每个键可能没有相同数量的列表。但由于这种灵活性,大型DataFrame可能会变慢。在这种情况下,如果dict1
包含只有一个条目,则下面修改的解决方案有效 -
k, v = list(dict1.items())[0]
pd.DataFrame(v, columns=columns, index=np.repeat(k, len(v))).reset_index()
index userid score related
0 808 a 5.4 b
1 808 c 4.1 b
2 808 d 3.7 f
答案 1 :(得分:3)
使用pd.Series
两次
df=pd.Series(dict1).apply(pd.Series).stack().apply(pd.Series).reset_index().drop('level_1',1)
df.columns=['memberid','userid', 'score', 'related']
df
Out[626]:
memberid userid score related
0 808 a 5.4 b
1 808 c 4.1 b
2 808 d 3.7 f
答案 2 :(得分:0)
将字典值输入pd.DataFrame
是一种方式。
这里我们使用next(iter(some_view))
语法来提取唯一的键和唯一值。
这是一个有效的解决方案,您可以保证您的词典只有一个键,值是列表。
df = pd.DataFrame(next(iter(dict1.values())), columns=['userid', 'score', 'related'])\
.assign(memberid=next(iter(dict1.keys())))
print(df)
userid score related memberid
0 a 5.4 b 808
1 c 4.1 b 808
2 d 3.7 f 808