Pandas multindex DataFrame:将某些值替换为第二层其他列的值

时间:2019-01-31 11:41:33

标签: python pandas dataframe multi-index

我有以下多索引DataFrame:

    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"的遮罩,并删除了第二级

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 个答案:

答案 0 :(得分:1)

使用mask通过<LQ DataFrame用LQ替换值,然后通过drop删除此级别,而将{{3}的第一级别droplevel删除}}和最后一个join在一起:

MultiIndex

如果只有一个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 列,则将set_indexrename_axis和最后一个reset_index一起使用:

0, bla