首页 > 解决方案 > 如何将 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

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

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?从另一个问题中学习,我还尝试了两种尝试匹配update和之间的索引的方法res.total.task_2。但是,它们都不适用于我的情况。

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

标签: pythonpandasdataframe

解决方案


我们有一个添加级别的选项,我们可以使用它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

推荐阅读