簡體   English   中英

從嵌套字典列表中獲取 pandas dataframe

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM