我有以下多索引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"的蒙版,将第2级

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


我想


'<LQ'替换为相应'LQ'列中的值
删除'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]})

最佳答案

使用mask替换<LQ DataFrame用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_indexrename_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

关于python - Pandas multiindex DataFrame:将某些值替换为第二层另一列的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54459814/

10-15 23:52