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

时间:2019-05-24 12:41:49

标签: python list loops dataframe dictionary

我有一个字典清单的清单。我设法访问了外部列表中的每个列表元素,并通过熊猫将字典转换为数据框。然后,我保存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)

它创建了一个漂亮的表。

enter image description here

这是我尝试创建数据帧列表的方法:

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

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

... [{'name':“美国小外岛”,“人口”:300},   {'name':'美国',    '人口':323947000,    '区域':9629091.0,    'gini':48.0}], ...

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

3 个答案:

答案 0 :(得分:4)

您可以从包含列表中删除每个字典,而仅将list中的dict

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

同样,这是在不需要的条目具有无效列的假设下进行的,在这里尤其是这种情况。否则,这至少会弄平数据结构,因此您以后可以用熊猫对其进行过滤

答案 1 :(得分:1)

创建并清空DataFrame并在每个循环上使用df.append遍历列表:

>>> 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}]]

>>> df = pd.DataFrame()                                                                                                                                                                   

>>> for country in mwe: 
...     df = df.append(country) 
...

>>> df
            area  gini         name  population
    0   323802.0  25.8       Norway     5223256
    0    41284.0  33.7  Switzerland     8341600
    0  7692024.0  30.5    Australia    24117360

答案 2 :(得分:1)

尝试一下:

df = pd.DataFrame(columns = ['name', 'population', 'area', 'gini'])
for i in range(len(mwe)):
    df.loc[i] = list(mwe[i][0].values())

输出

          name       pop       area  gini
0       Norway   5223256   323802.0  25.8
1  Switzerland   8341600    41284.0  33.7
2    Australia  24117360  7692024.0  30.5