簡體   English   中英

如何提取 3 級字典最內層字典的值並將這些值保存在 Pandas DataFrame 中?

[英]How do I extract the values of the innermost dictionary of a 3-level dictionary and save those values in a Pandas DataFrame?

我有一個 3 級嵌套字典,其結構如下:

Dictionary 1: Keys: 1, 2, 3, 4. 1代表冬季,2代表spring,3代表夏季,4代表秋季。

詞典 2. 關鍵詞:2005 年至 2018 年。

字典 3. 鍵值:0 到 24。0 到 24 表示每小時平均值。 每個鍵的值都與那個季節那一年的每小時平均值有關。

我也張貼了 3 部詞典的圖片。

我是 Python 的初學者,到目前為止我已經嘗試了下面的代碼,但它沒有給我想要的輸出。

df = pd.DataFrame.from_dict({(i, j, k): pm_10_abs_season[i][j][k] for i in pm_10_abs_season.keys() for j in pm_10_abs_season[i].keys() for k in pm_10_abs_season[i][j]}, orient = 'index')

在此處輸入圖像描述

我得到的 output 看起來像這樣:

在此處輸入圖像描述

我想將數據保存在四個 Pandas DataFrame 中。 每個季節一個。 然后,我想以以下格式保存數據:

列:第 0 小時、第 1 小時、第 3 小時、...、第 23 小時

行數:2005、2006、2007、...、2018

因此,Pandas DataFrame 的結構如下所示:

Year|Hour 0|Hour 1|Hour 2|...|Hour 23
-------------------------------------
2005|
2005|
2005|
... |
2018|

我想將數據保存在四個 Pandas DataFrames 中

我假設您對嵌套數據幀沒有問題,因為您沒有另外指定,並且您想要的 output 結構沒有任何反對意見。 如果您想展平它,那么我需要有關 output 結構的更多詳細信息,最好還需要一些 output 的樣本。


你可以使用類似的東西

def dict2df(seasonDict:dict):
    df = pd.DataFrame(seasonDict).T.rename_axis('Year', axis='rows')
    return df.rename(lambda n: f'Hour {n}', axis='columns')

或者

def dict2df(seasonDict:dict):
    return pd.DataFrame([{'Year': yk, **{
        f'Hour {hk}': hdf for hk, hdf in yd.items()
    }} for yk, yd in seasonDict.items()]).set_index('Year')

[在我意識到/發現{column->{index->value}}是 pd.DataFrame 的有效輸入結構並且pd.DataFrame中的 4 個詞典有一個 { pm_10_abs_season >{column->value }}結構,只需要轉置.T )即可非常接近您想要的 output 結構。 第二個版本似乎確實快了一點(大約 10%),但我不確定你是否認為它足夠重要。]


無論如何,我生成了一個測試輸入seasons_dfs )來模仿你的pm_10_abs_season (但里面的數據幀只有一個包含字符串'<DataFrame>'單元格)

seasonRef = {k:v for k,v in enumerate(['winter','spring','summer','autumn'],1)}
# seasonRef = {1: 'winter', 2: 'spring', 3: 'summer', 4: 'autumn'}

seasons_dfs = {sk: {yk: {
    hk: pd.DataFrame(
        {f'{sn[0]}_{str(yk)[-2:]}':{f'hour{hk:0>2}':f'<DataFrame>'}}
    ) for hk in range(24)
} for yk in range(2005,2019)} for sk,sn in seasonRef.items()}

然后使用 function ( dict2df(sd) )將其轉換為數據幀字典 ( nestedDfs )。

nestedDfs = {
    seasonRef.get(s, f'[season {s}]'): dict2df(sd) 
    for s, sd in seasons_dfs.items()
}

nestedDfs 中的 4 個nestedDfs應該有你想要的 output 結構: 冬天 春天 夏天 秋天

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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