更新多索引数据框中的值

updating a value in a multi index data frame

有人可以向我解释一下这种行为吗? 这是我的数据框:

df = pd.DataFrame(
    {
    'key1' : ['f1', 'f1', 'f2', 'f2', 'f3'],
    'key2' : ['fm1', 'fm2', 'fm1', 'fm2', 'fm1'],

    'k' : np.random.rand(5),
    'c' : [100, 200, 100, 150, 400],
    })
df.set_index(["key1","key2"],inplace=True)

当我尝试更改值时:

df.loc["f1","fm1"].loc["k"]=-999

没有任何反应。 df.loc["f1","fm1"].loc["k"] 仍然给出旧值 我想知道我做错了什么,我应该如何做到这一点?

只使用一个元组loc:

>>> df.loc[("f1", "fm1"), "k"] = -999
>>> df
                    k    c
key1 key2                 
f1   fm1  -999.000000  100
     fm2     0.082072  200
f2   fm1     0.119572  100
     fm2     0.752586  150
f3   fm1     0.947604  400
>>> 

您的代码不起作用的原因是 df.loc["f1", "fm1"] 引用了一个与原始 df 没有干扰的对象,它 returns 一个全新的数据框并替换了k 值,但它也不会在 df 中替换它。

在 pandas 文档中阅读有关 here 的更多信息。

因为您正试图更改数据帧中切片副本的值。 在这里阅读:Why does assignment fail when using chained indexing?

使用下面的代码可以达到预期的效果:

df["k"].loc["f1", "fm1"] = -999