Pandas multindex DataFrame: заменить определенные значения значениями из другого столбца на 2-м уровне - PullRequest
0 голосов
/ 31 января 2019

У меня есть следующий мультииндексный 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"

Iхотелось бы

  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 голосов
/ 31 января 2019

Используйте mask для замены значений на <LQ на LQ DataFrame, затем удалите эти уровни на 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
...