Python 从行索引为dict键的嵌套dict和每个键具有不同列的dict创建数据帧

Python 从行索引为dict键的嵌套dict和每个键具有不同列的dict创建数据帧,python,pandas,Python,Pandas,我有一份表格: pd_dict={'row_id_1':{'col_1':val1,'col_2':val2}, 'row_id_2':{'col_1':val3,'col_3':val4,'col_4':val5} ... } 我想把它转换成一个数据帧: col_1 col_2 col_3 col4 ... row_id_1 val1 val2 NaN NaN row_id_2 val3 NaN

我有一份表格:

pd_dict={'row_id_1':{'col_1':val1,'col_2':val2},
'row_id_2':{'col_1':val3,'col_3':val4,'col_4':val5}
...
}
我想把它转换成一个数据帧:

            col_1    col_2    col_3    col4    ...
row_id_1    val1     val2     NaN      NaN
row_id_2    val3     NaN      val4     val5
...
每行的列数不同。相同的列可能在不同的行上重复,也可能不重复。我想合并所有,并在适当的地方填写NaN值

我试过:

pd.DataFrame.from_dict(pd_dict,orient='index'))
…但这并不能给出正确的输出

我还尝试了每行创建一个数据帧,然后像这样对它们进行压缩:

frames=[]
...
对于k,pd_dict.items()中的cols:
...
append(pd.DataFrame.from_dict({k:list(cols.values())},orient='index',columns=list(cols.keys()))
...
df=局部混凝土(框架)
这是可行的,但需要很长时间


值得一提的是,我的数据大约有1000行,每行1000列,因此性能可能会成为一个问题。提前谢谢

这是由于
dict
len
不均匀造成的

pd.Series(pd_dict).apply(pd.Series)

这是由于
dict
len
不均匀造成的

pd.Series(pd_dict).apply(pd.Series)

您可以执行以下操作:

df = pd.DataFrame(pd_dict).T
print(df)
#         col_1 col_2 col_3 col_4
#row_id_1  val1  val2   NaN   NaN
#row_id_2  val3   NaN  val4  val5
此外,如果您对以下内容进行了排序,您最初的尝试也会起作用:

print(pd.DataFrame.from_dict(pd_dict,orient='index').sort_index(1))
#         col_1 col_2 col_3 col_4
#row_id_1  val1  val2   NaN   NaN
#row_id_2  val3   NaN  val4  val5

您可以执行以下操作:

df = pd.DataFrame(pd_dict).T
print(df)
#         col_1 col_2 col_3 col_4
#row_id_1  val1  val2   NaN   NaN
#row_id_2  val3   NaN  val4  val5
此外,如果您对以下内容进行了排序,您最初的尝试也会起作用:

print(pd.DataFrame.from_dict(pd_dict,orient='index').sort_index(1))
#         col_1 col_2 col_3 col_4
#row_id_1  val1  val2   NaN   NaN
#row_id_2  val3   NaN  val4  val5

pd.DataFrame(pd_dict).T
pd.DataFrame(pd_dict).T
?我尝试按照您的建议对索引进行排序,但没有成功。然而,使用转置确实有效,但不能保持列的顺序(它们似乎按字母顺序排序)。有办法维持秩序吗?@capitan什么版本的python?在python 3.6之前,字典是无序的。撇开字典键顺序不谈,您的问题有点模棱两可,因为并非所有的列都出现在所有字典中。如何确定正确的顺序?我使用的是python 3.7。所有行都有相同的前3列(pd_dict的dict值中的第一个键),所以我希望这些列显示在前面。从那以后,我就不在乎顺序了。我试着按照你的建议对索引进行排序,但没有成功。然而,使用转置确实有效,但不能保持列的顺序(它们似乎按字母顺序排序)。有办法维持秩序吗?@capitan什么版本的python?在python 3.6之前,字典是无序的。撇开字典键顺序不谈,您的问题有点模棱两可,因为并非所有的列都出现在所有字典中。如何确定正确的顺序?我使用的是python 3.7。所有行都有相同的前3列(pd_dict的dict值中的第一个键),所以我希望这些列显示在前面。从那以后,我就不在乎订单了。