簡體   English   中英

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

[英]How to add a pd.Series to a subset of multi-index DataFrame?

我有一個多索引 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

或使用pandas.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM