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

Wen*_* D. 4 python dictionary dataframe pandas

我有一个python字典如下:

dict1={808: [['a', 5.4, 'b'],
  ['c', 4.1 , 'b'],
  ['d', 3.7 , 'f']]} 
Run Code Online (Sandbox Code Playgroud)

我想将其转换为数据框,如下所示:

memberid  userid score related
808       a      5.4     b
808       c      4.1     b
808       d      3.7     f
Run Code Online (Sandbox Code Playgroud)

我试过下面的代码:

df=pd.DataFrame.from_dict(dict1,orient='index')
Run Code Online (Sandbox Code Playgroud)

结果不是我想要的.

有谁知道如何解决这个问题?谢谢!

cs9*_*s95 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()
)
Run Code Online (Sandbox Code Playgroud)

或者,以类似的方式 -

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()
Run Code Online (Sandbox Code Playgroud)

df

   memberid userid  score related
0       808      a    5.4       b
1       808      c    4.1       b
2       808      d    3.7       f 
Run Code Online (Sandbox Code Playgroud)

重要说明 - 此解决方案适用于多个键值对,其中每个键可能没有相同数量的列表.但由于这种灵活性,大型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
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 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
Run Code Online (Sandbox Code Playgroud)