如何从一个包含值列表的字典列表中创建DataFrame?

3
我有一个列表的列表,其中包含在列表中的值为字典。我希望将其转换为如下所示的数据框:
data_list = [
{'Width':[20,25,30,40],'Length':[21,22,23,24],'Ratio':[1.05,0.88,0.767,0.6]},
{'Width':[10,15,24,35],'Length':[20,25,30,40],'Ratio':[2,1.67,1.25,1.14]}
]

我尝试使用pd.DataFrame.from_dict(data_list),但是结果不尽如人意,如下所示:

|   |          Width |        Length |                 Ratio |
|---| -------------- | ------------  | --------------------- |
| 0 | [20,25,30,40]  | [21,22,23,24] | [1.05,0.88,0.767,0.6] |
| 1 | [10,15,24,35]  | [20,25,30,40] |    [2,1.67,1.25,1.14] |

我期望的如下:

|   | Width | Length | Ratio |
|---| ----- | ------ | ----- |
| 0 |   20  |     21 |  1.05 |
| 1 |   25  |     22 |  0.88 |
......
| 6 |   24  |     30 |  1.25 |
| 7 |   35  |     40 |  1.14 |

非常感谢您的帮助!


df.apply(pd.Series.explode).reset_index(drop=True) - sushanth
@sushanth 我在 pd.DataFrame.from_dict(data_list) 之后使用了你的代码,但仍然无法工作。 - Hang
1
这段代码适用于我:pd.DataFrame.from_dict(data_list).apply(pd.Series.explode).reset_index(drop=True),在 pandas 版本为 1.3.1 - sushanth
@CheTou - 性能很重要吗? - jezrael
3个回答

1
使用评论中的解决方案:
df = pd.DataFrame(data_list).apply(pd.Series.explode).reset_index(drop=True)
print (df)
  Width Length  Ratio
0    20     21   1.05
1    25     22   0.88
2    30     23  0.767
3    40     24    0.6
4    10     20      2
5    15     25   1.67
6    24     30   1.25
7    35     40   1.14

另一个想法是使用 defaultdictextend,最后传递给 DataFrame 构造函数以提高性能:
from collections import defaultdict
d = defaultdict(list)

for di in data_list:
    for k, v in di.items():
        d[k].extend(v)
        
df = pd.DataFrame(d)
print (df)
   Width  Length  Ratio
0     20      21  1.050
1     25      22  0.880
2     30      23  0.767
3     40      24  0.600
4     10      20  2.000
5     15      25  1.670
6     24      30  1.250
7     35      40  1.140

0

我认为这可以满足您的需求,如果您不需要索引。

import pandas as pd


data_list = [
{'Width':[20,25,30,40],'Length':[21,22,23,24],'Ratio':[1.05,0.88,0.767,0.6]},
{'Width':[10,15,24,35],'Length':[20,25,30,40],'Ratio':[2,1.67,1.25,1.14]}
]

for data in data_list:
    df = df.append(pd.DataFrame(data))



0
另一个选项是将DataFrame列表连接起来:
pd.concat([pd.DataFrame(ent) for ent in data_list], ignore_index = True)

   Width  Length  Ratio
0     20      21  1.050
1     25      22  0.880
2     30      23  0.767
3     40      24  0.600
4     10      20  2.000
5     15      25  1.670
6     24      30  1.250
7     35      40  1.140

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接