将一个嵌套列表的字典转换为 pandas DataFrame

6

我有一个如下的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')

我的结果并不是我想要的。

有没有人知道如何修复这个问题? 谢谢!


1
dict1 是否总是只有一个键? - jpp
3个回答

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 

重要提示——该解决方案也适用于多个键值对,其中每个键可能没有相同数量的列表。但由于这种灵活性,对于大型数据框而言可能会变得较慢。在这种情况下,如果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

我知道,这肯定是低效的,但我会尽力的 :-) - BENY
你不能直接将列表的列表传递给 pd.DataFrame 吗? - jpp
哦,我明白了“如果你有...”,但这真的取决于使用情况。如果 OP 有一千个只有一个项目的字典,那么简单的方法更好。如果你有各种不同长度的字典,那么你的方法更灵活。 - jpp
1
@jpp 说得好,你应该在你的解决方案中提到这个警告 :) 顺便说一下,你的批评非常公正,我已经尝试用一个类似于你的替代方案来解决它。 - cs95
1
由于我的字典有多个键和不同的长度,所以这个解决方案对我很有效。感谢大家! - Wendy D.
显示剩余2条评论

5

多次使用 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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接