【问题标题】:updating a value in a multi index data frame更新多索引数据框中的值
【发布时间】:2021-12-10 03:37:34
【问题描述】:

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

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"] 仍然给出旧值 我想知道我做错了什么,我应该如何做到这一点?

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    使用一个元组并且只有一个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 没有干扰的对象,它返回一个全新的数据帧并替换k 值,但它没有也不要在 df 中替换它。

    在 pandas 文档中了解更多信息 here

    【讨论】:

      【解决方案2】:

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

      可以使用以下代码来实现所需的结果:

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

      【讨论】:

        猜你喜欢
        • 2018-10-04
        • 2020-04-16
        • 2020-04-01
        • 2023-03-14
        • 2013-12-30
        • 2016-06-13
        • 2018-08-24
        • 2019-10-23
        相关资源
        最近更新 更多