如何从包含列表的字典列表中获取扁平数据框?

How to get a flatten dataframe from lists of dictionaries which contain lists?

我正在尝试将这种数据结构扁平化为 "plain" 数据框。

原始数据是字典列表,其中包含列表。

数据看起来像这样(可重现的例子):

data = [{'A':[1,2,3,4], 'B':[11,12,13,14]}, {'A':[5,6,7,8], 'B':[15,16,17,18]}]

我想要的输出应该是以下 pandas 数据帧:

Out[01]: 
   A   B
0  1  11
1  2  12
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17
7  8  18

我怎样才能达到这个结果? 谢谢

您可以使用pd.Series.explode

data = [{'A':[1,2,3,4], 'B':[11,12,13,14]}, {'A':[5,6,7,8], 'B':[15,16,17,18]}]

df = pd.DataFrame(data).apply(pd.Series.explode).reset_index(drop=True)

   A   B
0  1  11
1  2  12
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17
7  8  18

或使用collections.defaultdict

from collections import defaultdict
new = defaultdict(list)

for d in data:
    for k, v in d.items():
        new[k].extend(v)

df = pd.DataFrame(new)

   A   B
0  1  11
1  2  12
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17
7  8  18

您可以简单地生成每个 DataFrame 并将它们全部连接起来:

import pandas as pd

data = [{'A':[1,2,3,4], 'B':[11,12,13,14]}, {'A':[5,6,7,8], 'B':[15,16,17,18]}]

df = pd.concat((pd.DataFrame(elm) for elm in data), ignore_index=True)
print(df)


   A   B
0  1  11
1  2  12
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17
7  8  18

试试下面的代码:


import pandas as pd
data = [{'A':[1,2,3,4], 'B':[11,12,13,14]}, {'A':[5,6,7,8], 'B':[15,16,17,18]}]

df = pd.DataFrame(data).apply(pd.Series.explode).reset_index(drop=True)

print(df)

为了提高性能使用 collections.defaultdictextend:

from collections import defaultdict

d = defaultdict(list)
for x in data:
    for k, v in x.items():
        d[k].extend(v)
df = pd.DataFrame(d)
print (df)
   A   B
0  1  11
1  2  12
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17
7  8  18