[英]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()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.