将字典列表转换为数据框

niv*_*wda 3 python dictionary pandas

我有一个字典列表,它看起来像:

list_dict = [{'test1':{'a':1,'b':12,'c':40,'d':120,'e':20,'f':1,'g':2,'h':'2'}},
                  {'test2':{'a':5,'b':'10','c':20}},
                   {'test3':{'e':21,'f':'18','g':22,'h':20}}]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为这样的数据框:键应该作为行出现,测试应该作为列出现。并且在测试没有其他测试中存在的键的情况下,应将值填充为 NAN

    mac_type  test1  test2  test3
    a         1      5      NAN
    b         12     10     NAN
    c         40     20     NAN
    d         120    NAN    NAN
    e         20     NAN    21
    f         1      NAN    18
    g         2      NAN    22
    h         2      NAN    20
Run Code Online (Sandbox Code Playgroud)

请帮助我。

jez*_*ael 5

使用带有扁平化嵌套字典的字典理解并传递给Dataframe构造函数:

df = pd.DataFrame({k: v for x in list_dict for k, v in x.items()})
print (df)
  test1 test2 test3
a     1     5   NaN
b    12    10   NaN
c    40    20   NaN
d   120   NaN   NaN
e    20   NaN    21
f     1   NaN    18
g     2   NaN    22
h     2   NaN    20
Run Code Online (Sandbox Code Playgroud)

或者DataFrame为每个嵌套字典创建并传递给concat, 如果大字典和许多外部键这应该像第一个解决方案一样慢:

df = pd.concat([pd.DataFrame(x) for x in list_dict], axis=1)
print (df)
  test1 test2 test3
a     1     5   NaN
b    12    10   NaN
c    40    20   NaN
d   120   NaN   NaN
e    20   NaN    21
f     1   NaN    18
g     2   NaN    22
h     2   NaN    20
Run Code Online (Sandbox Code Playgroud)

  • @ansev 是的,我的意思是 jezrael 回答得很快。我没有谈论性能。 (2认同)