【问题标题】:Pandas update values in a multi-index dataframePandas 更新多索引数据框中的值
【发布时间】:2018-10-04 18:01:22
【问题描述】:

如何编辑多索引数据框的值?如果它是一个非多索引数据框,我知道我可以这样做:df.at[0,'foo'] = 12.3。 此外,这不起作用:df.loc[0]['foo']['a'] = 12.3

考虑一个多索引列数据框。

colnames = [
    ['foo', 'foo', 'foo', 'po', 'po', 'po', 'di', 'di', 'di'],
    ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']
]
df = pd.DataFrame(columns=colnames, index=arange(5))

display(df)
   foo             po             di          
     a    b    c    a    b    c    a    b    c
0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
4  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    使用tuples 在列中选择MultiIndex

    df.loc[0, ('foo','a')] = 12.3
    print (df)
        foo             po             di          
          a    b    c    a    b    c    a    b    c
    0  12.3  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    1   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    2   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    3   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    4   NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
    

    如果需要更复杂的更新使用slicers:

    idx = pd.IndexSlice
    df.loc[0, idx['foo', ['b','c']]] = 12.3
    print (df)
       foo               po             di          
         a     b     c    a    b    c    a    b    c
    0  NaN  12.3  12.3  NaN  NaN  NaN  NaN  NaN  NaN
    1  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
    2  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
    3  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
    4  NaN   NaN   NaN  NaN  NaN  NaN  NaN  NaN  NaN
    

    df.loc[0, idx[:, ['b','c']]] = 12.3
    print (df)
       foo               po               di            
         a     b     c    a     b     c    a     b     c
    0  NaN  12.3  12.3  NaN  12.3  12.3  NaN  12.3  12.3
    1  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
    2  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
    3  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
    4  NaN   NaN   NaN  NaN   NaN   NaN  NaN   NaN   NaN
    

    df.loc[:, idx[['po','di'], 'a']] = 12.3
    print (df)
       foo              po              di          
         a    b    c     a    b    c     a    b    c
    0  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
    1  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
    2  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
    3  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
    4  NaN  NaN  NaN  12.3  NaN  NaN  12.3  NaN  NaN
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 2015-09-05
      • 2020-10-22
      • 2019-02-05
      • 2020-06-21
      • 2014-09-08
      • 2019-06-04
      • 2019-05-16
      相关资源
      最近更新 更多