Skip to main content
 首页 » 编程设计

python之如何通过循环将字典列表的列表转换为数据框

2025年05月04日16xxx_UU

我有一个字典列表。我设法访问了外部列表中的每个列表元素,并通过 pandas 将字典转换为数据框。然后我保存 DF 并稍后连接它。这是一个完美的结果。但我需要一个循环来处理大数据。

这是我的 MWE,原则上工作正常。

import pandas as pd 
 
mwe = [ 
    [{"name": "Norway", "population": 5223256, "area": 323802.0, "gini": 25.8}], 
    [{"name": "Switzerland", "population": 8341600, "area": 41284.0, "gini": 33.7}], 
    [{"name": "Australia", "population": 24117360, "area": 7692024.0, "gini": 30.5}], 
] 
 
df0 = pd.DataFrame.from_dict(mwe[0]) 
df1 = pd.DataFrame.from_dict(mwe[1]) 
df2 = pd.DataFrame.from_dict(mwe[2]) 
 
frames = [df0, df1, df2] 
result = pd.concat(frames) 
 

它创建了一个漂亮的表格。

这是我尝试创建数据框列表的内容:

for i in range(len(mwe)):  
    frame = pd.DataFrame() 
    frame = pd.DataFrame.from_dict(mwe[i]) 
    frames = [] 
    frames.append(frame) 

附录:感谢您的所有回答。他们正在研究我的 MWE。这让我注意到我的数据集中有一些奇怪的条目。没有解决方案适用于我的数据集,因为我有一个包含两个字典的内部列表元素(由于非唯一数据检索):

.... [{'name': '美国本土外小岛屿', '人口': 300}, {'名称':'美利坚合众国', '人口':323947000, '地区':9629091.0, '基尼':48.0}], ...

如何删除“美国本土外小岛屿”条目?

请您参考如下方法:

您可以从包含列表中取出每个字典,并只得到一个包含 dict 的 list:

import pandas as pd 
mwe = [[{'name': 'Norway', 'population': 5223256, 'area': 323802.0, 'gini': 25.8}], 
 [{'name': 'Switzerland', 
   'population': 8341600, 
   'area': 41284.0, 
   'gini': 33.7}], 
 [{'name': 'Australia', 
   'population': 24117360, 
   'area': 7692024.0, 
   'gini': 30.5}]] 
 
# use x.pop() so that you aren't carrying around copies of the data 
# for a "big data" application 
df = pd.DataFrame([x.pop() for x in mwe]) 
 
 
df.head() 
        area  gini         name  population 
0   323802.0  25.8       Norway     5223256 
1    41284.0  33.7  Switzerland     8341600 
2  7692024.0  30.5    Australia    24117360 

通过将列表理解引入数据框声明,该列表是临时的,您不必担心清理。 pop 还将消耗 mwe 中的字典,从而最大限度地减少内存中携带的副本数量

请注意,执行此操作时,mwe 将如下所示:

mwe 
[[], [], []] 

因为子列表的内容已经弹出

编辑:新问题内容

如果您的数据包含重复项,或者至少包含您不想要的条目,并且不需要的条目与数据集的其余部分没有匹配的列(看起来是这种情况),则变得有点棘手避免像上面那样复制数据:

mwe.append([{'name': 'United States Minor Outlying Islands', 'population': 300}, {'name': 'United States of America', 'population': 323947000, 'area': 9629091.0, 'gini': 48.0}]) 
 
key_check = {}.fromkeys(["name", "population", "area", "gini"]) 
 
# the easy way but copies data 
df = pd.DataFrame([item for item in data 
                   for data in mwe  
                   if item.keys()==key_check.keys()]) 

因为您仍会在 mwe 中保留数据。使用生成器可能会更好

def get_filtered_data(mwe): 
    for data in mwe: 
        while data: # when data is empty, the while loop will end 
            item = data.pop() # still consumes data out of mwe 
            if item.keys() == key_check.keys(): 
                yield item    # will minimize data copying through lazy evaluation 
 
df = pd.DataFrame([x for x in get_filtered_data(mwe)]) 
 
        area  gini                      name  population 
0   323802.0  25.8                    Norway     5223256 
1    41284.0  33.7               Switzerland     8341600 
2  7692024.0  30.5                 Australia    24117360 
3  9629091.0  48.0  United States of America   323947000 

同样,这是在假设不需要的条目具有无效列的情况下,具体而言,这里似乎就是这种情况。否则,这至少会展平数据结构,以便您稍后可以使用 pandas 对其进行过滤