代码之家  ›  专栏  ›  技术社区  ›  NicoH

PANDAS MULTINDEX数据帧:用第2级其他列的值替换某些值

  •  1
  • NicoH  · 技术社区  · 5 年前

    我有以下多索引数据帧:

        0   M1        M2     
      bla    C   LQ    C   LQ
    0   1  1.6  0.1  2.7  0.5
    1   2  <LQ  0.2  4.1  0.3
    2   3  NaN  NaN  NaN  NaN
    3   4  3.2  0.1  <LQ  0.4
    

    此外,我还制作了一个面具 'C' "<LQ" ,降低第2级

    mask = df.xs('C',level=1, axis=1) == "<LQ"
    

    我想

    1. 代替 '<LQ' 按各自的值 'LQ'
    2. 放弃 “LQ” 列并将列缩小到一个级别,保留第二个级别所在的第一个级别的名称 ['C', 'LQ'] 把第二层的名字留着给其他人,就像这样:

    :

       bla     M1    M2
    0    1    1.6   2.7
    1    2    0.2   4.1
    2    3    NaN   NaN
    3    4    3.2   0.4
    

    同时使用遮罩跟踪替换值(例如,用于以后的绘图)

    生成df的代码:

    df = pd.DataFrame({(0,'bla'): [1,2,3,4],
                       ('M1', 'C'): [1.6,'<LQ',np.nan,3.2],
                       ('M1', 'LQ'): [0.1,0.2,np.nan,0.1],
                       ('M2', 'C'): [2.7,4.1,np.nan,'<LQ'],
                       ('M2', 'LQ'): [0.5,0.3,np.nan,0.4]})
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    使用 mask 用于将值替换为 <LQ 通过 LQ 数据帧,然后通过 drop 移除第一层 MultiIndex 通过 droplevel 最后 join 一起:

    df1 = df.xs('C',level=1, axis=1)
    df1 = df1.mask(df1 == "<LQ", df.xs('LQ',level=1, axis=1))
    
    df2 = df.drop(['C','LQ'], axis=1, level=1)
    df2.columns = df2.columns.droplevel(0)
    
    df = df2.join(df1)
    print (df)
       bla   M1   M2
    0    1  1.6  2.7
    1    2  0.2  4.1
    2    3  NaN  NaN
    3    4  3.2  0.4
    

    如果只有一个 0, bla 然后使用列 set_index 具有 rename_axis 最后 reset_index :

    df = df.set_index((0,'bla'))
    df1 = df.xs('C',level=1, axis=1)
    df = (df1.mask(df1 == "<LQ", df.xs('LQ',level=1, axis=1))
             .rename_axis('bla')
             .reset_index())
    
    print (df)
       bla   M1   M2
    0    1  1.6  2.7
    1    2  0.2  4.1
    2    3  NaN  NaN
    3    4  3.2  0.4