【问题标题】:How to replace certain values of a multiindex?如何替换多索引的某些值?
【发布时间】:2020-09-28 18:37:55
【问题描述】:

我有一个看起来像的数据框 this 带有多索引。 现在,如果前一行中的日期是星期六,我想用 4 替换集群列中等于 1 的所有值。

我设法得到了一个布尔数组,它对所有需要更改的值都为真,对所有其他值都为假,如下所示:

a = pd.to_datetime(data_pivot.index.get_level_values(0)).dayofweek==6
b = data_pivot.index.get_level_values(1)==1

np.logical_and(a, b)

但现在我不知道如何相应地更改我的多索引中的所有值。

【问题讨论】:

    标签: python pandas dataframe indexing replace


    【解决方案1】:

    这并不容易。一个MultiIndex是由元组组成的,元组是不可变的,而Index本身是不可变的,所以我们需要重新创建整个MultiIndex。

    从数组中重新创建整个 MultiIndex,我们在其中使用np.where 修改第二级,以在满足您的条件时将其更改为 4。

    样本数据

    import pandas as pd
    import numpy as np
    
    idx = pd.MultiIndex.from_arrays([pd.date_range('2010-01-01', freq='d', periods=5), 
                                     [2,2,1,1,2]])
    df = pd.DataFrame({'data': 1}, index=idx)
    #              data
    #2010-01-01 2     1
    #2010-01-02 2     1
    #2010-01-03 1     1
    #2010-01-04 1     1
    #2010-01-05 2     1
    

    m = ((df.index.get_level_values(0).dayofweek == 6) 
          & (df.index.get_level_values(1) == 1))
    
    df.index = pd.MultiIndex.from_arrays([df.index.get_level_values(0),
                                          np.where(m, 4, df.index.get_level_values(1))])
    
    print(df)
    #              data
    #2010-01-01 2     1
    #2010-01-02 2     1
    #2010-01-03 4     1  <- Index level 1 is changed to 4
    #2010-01-04 1     1
    #2010-01-05 2     1
    

    【讨论】:

      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 2015-04-24
      • 2018-04-15
      • 1970-01-01
      • 2022-01-02
      • 2016-07-06
      • 2022-09-27
      • 1970-01-01
      相关资源
      最近更新 更多