如何将pd.Series添加到多索引DataFrame的子集



我有一个由创建的多索引数据帧

arrays = [['task_1','task_2', 'task_2'],['accuracy', 'accuracy', 'precision']]
mux = pd.MultiIndex.from_arrays(arrays, names=('task', 'metric'))
data = [[4., 5., 6.], [1., 1., 1.]]
res = pd.DataFrame(data, columns=mux, index=['total', 'counts']).transpose()
>>> res                  
total  counts
task   metric                  
task_1 accuracy     4.0     1.0
task_2 accuracy     5.0     1.0
precision    6.0     1.0

现在我想通过将[0.1, 0.2]分别添加到task_2.accuracytask_2.precision来更新task_2total列:

update = pd.Series([0.1, 0.2], index=['accuracy', 'precision'])
res.total.task_2 += update
>>> res
total  counts
task   metric                  
task_1 accuracy     4.0     1.0
task_2 accuracy     NaN     1.0
precision    NaN     1.0

为什么我得到NaN?从另一个问题中学习,我还尝试了两种方法来匹配updateres.total.task_2之间的索引。然而,在我的情况下,它们都不起作用。

res.total.task_2 += update.values
# -OR-
res.total.task_2 += update.reset_index(drop=True, inplace=True)

我们有一个在级别上添加的选项,可以与series.xs一起使用,只在所需的第0级别上添加,然后重新索引并添加:

res['total'] = (res['total'].xs("task_2",drop_level=False)
.add(update,level=1).reindex(res.index)
.fillna(res['total']))
print(res)
total  counts
task   metric                  
task_1 accuracy     4.0     1.0
task_2 accuracy     5.1     1.0
precision    6.2     1.0

似乎需要通过更新所有行来更改res.total.task_2

res.total.task_2.iloc[:] = res.total.task_2 + update

或者和熊猫在一起。Series.update((

res.total.task_2.update(res.total.task_2 + update)

或者逐个增加的价值

for i in range(len(update)):
res.total.task_2.iloc[i] += update.iloc[i]
# print(res)
total  counts
task   metric                  
task_1 accuracy     4.0     1.0
task_2 accuracy     5.1     1.0
precision    6.2     1.0

最新更新