我有以下多索引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"
我想
'<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]})
答案 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_index
与rename_axis
和最后一个reset_index
一起使用:
0, bla