小能豆

根据结合两个多索引 dfs 和列索引的元组列表构建字典

py

我有两个多索引数据框:平均值和标准差

arrays = [['A', 'A', 'B', 'B'], ['Z', 'Y', 'X', 'W']]

mean=pd.DataFrame(data={0.0:[np.nan,2.0,3.0,4.0], 60.0: [5.0,np.nan,7.0,8.0], 120.0:[9.0,10.0,np.nan,12.0]}, 
         index=pd.MultiIndex.from_arrays(arrays, names=('id', 'comp')))
mean.columns.name='Times'

std=pd.DataFrame(data={0.0:[10.0,10.0,10.0,10.0], 60.0: [10.0,10.0,10.0,10.0], 120.0:[10.0,10.0,10.0,10.0]}, 
         index=pd.MultiIndex.from_arrays(arrays, names=('id', 'comp')))
std.columns.name='Times'

我的任务是将它们组合到一个以 ‘{id:’ 为第一级的字典中,然后是第二级字典,以 ‘{comp:’ 为第二级,然后为每个 comp 创建一个元组列表,该列表组合了 (时间点、平均值、标准差)。因此,结果应如下所示

{'A': {
     'Z': [(60.0,5.0,10.0),
            (120.0,9.0,10.0)],
      'Y': [(0.0,2.0,10.0),
            (120.0,10.0,10.0)]
       },
  'B': {
     'X': [(0.0,3.0,10.0),
            (60.0,7.0,10.0)],
      'W': [(0.0,4.0,10.0),
            (60.0,8.0,10.0),
            (120.0,12.0,10.0)]
       }
 }

此外,当数据中有 NaN 时,三元组将被忽略,因此在时间 0 时的值为 A、Z,在时间 60 时的值为 A、Y,在时间 120 时的值为 B、X。

我怎么去那里?我已经为单行构建了一个元组列表字典:

iter=0
{mean.index[iter][0]:{mean.index[iter][1]:list(zip(mean.columns, mean.iloc[iter], std.iloc[iter]))}}
>{'A': {'Z': [(0.0, 1.0, 10.0), (60.0, 5.0, 10.0), (120.0, 9.0, 10.0)]}}

现在,我需要扩展到一个字典,循环遍历每一行(内部字典)并添加每个(外部字典)的 ID。我从 iterrows 和 dic 理解开始,但在这里我遇到了问题,使用从 iterrows() 获得的 iter (‘A’,’Z’) 进行索引,并迭代构建整个字典。

{mean.index[iter[1]]:list(zip(mean.columns, mean.loc[iter[1]], std.loc[iter[1]])) for (iter,row) in mean.iterrows()}

会产生错误,而且我只会有内循环

KeyError:’标签 [Z] 不在 [索引] 中’

谢谢!

编辑:在这个例子中,我把数字换成了浮点数,因为这里之前生成的整数与我的实际数据不一致,并且在下面的 json 转储中会失败。


阅读 24

收藏
2024-12-31

共1个答案

小能豆

我找到了一种非常全面的方法来提出这个嵌套的字典:

mean_dict_items=mean.to_dict(orient='index').items()
{k[0]:{u[1]:list(zip(mean.columns, mean.loc[u], std.loc[u]))
      for u,v in mean_dict_items if (k[0],u[1]) == u} for k,l in mean_dict_items}

创建:

{'A': {'Y': [(0.0, 2.0, 10.0), (60.0, nan, 10.0), (120.0, 10.0, 10.0)],
  'Z': [(0.0, nan, 10.0), (60.0, 5.0, 10.0), (120.0, 9.0, 10.0)]},
 'B': {'W': [(0.0, 4.0, 10.0), (60.0, 8.0, 10.0), (120.0, 12.0, 10.0)],
  'X': [(0.0, 3.0, 10.0), (60.0, 7.0, 10.0), (120.0, nan, 10.0)]}}
2024-12-31