我有一个字典清单的清单。我设法访问了外部列表中的每个列表元素,并通过熊猫将字典转换为数据框。然后,我保存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}, {'name':'美国', '人口':323947000, '区域':9629091.0, 'gini':48.0}], ...
如何删除“美国本土外小岛屿”条目?
答案 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