[英]Getting pandas dataframe from list of nested dictionaries
我是 Python 的新手,所以這可能非常簡單,但我找了一段時間后沒能找到適合我的問題的答案。 我正在嘗試從字典列表中創建一個 Pandas dataframe。
我的嵌套字典列表如下:
my_list = [{0: {'a': '23', 'b': '15', 'c': '5', 'd': '-1'},
1: {'a': '5', 'b': '6', 'c': '7', 'd': '9'},
2: {'a': '9', 'b': '15', 'c': '5', 'd': '7'}},
{0: {'a': '5', 'b': '249', 'c': '92', 'd': '-4'},
1: {'a': '51', 'b': '5', 'c': '34', 'd': '1'},
2: {'a': '3', 'b': '8', 'c': '3', 'd': '11'}}]
所以主詞典中的每個鍵都有 3 個值。
使用data = pd.DataFrame(my_list)
將它們放入 dataframe 中會返回一些無法使用的內容,因為每個單元格中都有關於 a、b、c 和 d 的信息。
我想以 dataframe 結束,它看起來像這樣:
name| a | b | c | d
0 | 23 | 15 | 5 | -1
1 | 5 | 6 | 7 | 9
2 | 9 | 15 | 5 | 7
0 | 5 |249 | 92| -4
1 |51 | 5 | 34| 1
2 | 3 | 8 | 3 | 11
這可能嗎?
簡單:
pd.concat([pd.DataFrame(l) for l in my_list],axis=1).T
另一種解決方案:
from itertools import chain
pd.DataFrame.from_items(list(chain.from_iterable(d.iteritems() for d in my_list))).T
在我的實驗中,這比使用pd.concat
更快(尤其是當“子數據幀”的數量很大時),但代價是更加冗長。
您可以修改字典列表以供 DataFrame 構造函數使用:
In [4]: pd.DataFrame.from_records([{'name': k, **v} for d in my_list for k,v in d.items()])
Out[4]:
a b c d name
0 23 15 5 -1 0
1 5 6 7 9 1
2 9 15 5 7 2
3 5 249 92 -4 0
4 51 5 34 1 1
5 3 8 3 11 2
In [5]: df = pd.DataFrame.from_records([{'name': k, **v} for d in my_list for k,v in d.items()])
In [6]: df.set_index('name',inplace=True)
In [7]: df
Out[7]:
a b c d
name
0 23 15 5 -1
1 5 6 7 9
2 9 15 5 7
0 5 249 92 -4
1 51 5 34 1
2 3 8 3 11
這需要相對較新的 Python 版本才能使{'name':'something', **rest}
工作。 它只是以下內容的簡寫:
In [13]: reshaped = []
...: for d in my_list:
...: for k, v in d.items():
...: new = {'name': k}
...: new.update(v)
...: reshaped.append(new)
...:
In [14]: reshaped
Out[14]:
[{'a': '23', 'b': '15', 'c': '5', 'd': '-1', 'name': 0},
{'a': '5', 'b': '6', 'c': '7', 'd': '9', 'name': 1},
{'a': '9', 'b': '15', 'c': '5', 'd': '7', 'name': 2},
{'a': '5', 'b': '249', 'c': '92', 'd': '-4', 'name': 0},
{'a': '51', 'b': '5', 'c': '34', 'd': '1', 'name': 1},
{'a': '3', 'b': '8', 'c': '3', 'd': '11', 'name': 2}]
從熊貓導入數據幀
def flat_dict(data: dict, prefix=''): result = dict()
for key in data:
if len(prefix):
field = prefix + '_' + key
else:
field = key
if isinstance(data[key], dict):
result.update(
flat_dict(data[key], key)
)
else:
result[field] = data[key]
return result
refactor_data = map(lambda x: flat_dict(x), 數據)
df = DataFrame(refactor_data)
[pd.DataFrame.from_dict(l, orient='index') for l in my_list]
文檔說如果你想字典的鍵是行,那么使用orient='index'
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.