我有以下多索引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_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
关于python - Pandas multiindex DataFrame:将某些值替换为第二层另一列的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54459814/