如何从包含列表的字典列表中获取扁平数据框?
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
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.defaultdict
和 extend
:
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
我正在尝试将这种数据结构扁平化为 "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
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.defaultdict
和 extend
:
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