【发布时间】:2018-07-29 13:34:57
【问题描述】:
我有两个多索引数据框:mean 和 std
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 时,三元组被排除在外,因此 A,Z 在时间 0,A,Y 在时间 60 B,X 在时间 120。
我怎么去那里?我已经为单行构造了一个元组列表字典的字典:
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)]}}
现在,我需要在每行 {inner dict} 上循环并添加每个 {outer dict} 的 id 的字典。我从 iterrows 和 dic 理解开始,但在这里我遇到了问题,使用从 iterrows() 获得的 iter ('A','Z') 进行索引,并迭代地构建整个 dict。
{mean.index[iter[1]]:list(zip(mean.columns, mean.loc[iter[1]], std.loc[iter[1]])) for (iter,row) in mean.iterrows()}
会产生错误,我只会有内部循环
KeyError: '标签 [Z] 不在 [index] 中'
谢谢!
编辑:我在这个例子中将数字交换为浮点数,因为之前生成的整数与我的真实数据不一致,并且在后续 json 转储中会失败。
【问题讨论】:
-
这是一种奇怪的格式……每个组的第一列是列名吗?
-
对不起,我没听懂你的问题??这个例子正是我这里有我的真实数据的原始 df 格式。是的。
-
我已经制定了以下代码:
{iter[0]:{iter[1]:list(zip(mean.columns, mean.loc[iter], std.loc[iter])) for (iter,row) in mean.iterrows()} for (iter,row) in mean.iterrows()}但是,这真的很慢,并且它没有正确地换行,因为它完全迭代第一行和第二行,创建错误的索引级别[0] 和 level[1] dict,彼此不相关。
标签: python list pandas dictionary tuples