如何提取三级字典中最内层字典的值并将这些值保存在Pandas DataFrame中?

0md85ypi  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(131)

我有一个3层嵌套字典,其结构如下:
字典一:答案:1、2、3、4。1代表冬季,2代表 Spring ,3代表夏季,4代表秋季。
字典2.密钥:2005年至2018年。
字典3.键:0到24。0到24表示每小时平均值。每个键都有与该季节该年的每小时平均值有关的值。
我也贴出了这三本词典的图片。
我是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')

我得到的输出如下所示:

我想将数据保存在四个Pandas数据框中。每个季节一个。然后,我想将数据保存为以下格式:
列:0小时、1小时、3小时、......、23小时
行数:2005年、2006年、2007年、......、2018年
因此,Pandas DataFrame的结构类似于以下内容:

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

jgzswidk1#

我想将数据保存在四个Pandas数据框中
我假设您可以使用嵌套的DataFrame,因为您没有另外指定,并且您所需的输出结构没有表示任何反对它的内容。如果您想将其扁平化,那么我需要有关输出结构的更多详细信息,最好还需要一些输出示例。
你可以用类似

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的有效输入结构,并且pm_10_abs_season中的4个字典具有 {index-〉{column-〉value}} 结构,它只需要是transposed.T)以非常接近您想要的输出结构。第二个版本看起来确实快了一点点(约10%),但我不确定您是否认为这一点足够重要。]
无论如何,我生成了一个test inputseasons_dfs)来模拟您的pm_10_abs_season(但是其中的DataFrame只有一个包含字符串'<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()}

然后使用函数(* dict2df(sd) *)将其转换为 Dataframe 字典(nestedDfs)。

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

nestedDfs中的4个 Dataframe 应该具有您所需的输出结构:第一节第一节第一节第一节第二节第一节第三节第一节

相关问题