具有MultiIndex列的Pandas DataFrame中的布尔索引

时间:2019-07-03 08:31:37

标签: python pandas

我有一个带有MultiIndex列的DataFrame:

import numpy as np
import pandas as pd

columns = pd.MultiIndex.from_arrays([['n1', 'n1', 'n2', 'n2'], ['p', 'm', 'p', 'm']])
values = [
    [1,      2,  3,      4],
    [np.nan, 6,  7,      8],
    [np.nan, 10, np.nan, 12],
]
df = pd.DataFrame(values, columns=columns)
    n1       n2    
     p   m    p   m
0  1.0   2  3.0   4
1  NaN   6  7.0   8
2  NaN  10  NaN  12

现在,我想在mNaN时将p设置为NaN。这是我要寻找的结果:

    n1        n2     
     p    m    p    m
0  1.0  2.0  3.0  4.0
1  NaN  NaN  7.0  8.0
2  NaN  NaN  NaN  NaN

我知道如何找出pNaN的位置,例如使用

mask = df.xs('p', level=1, axis=1).isnull()
      n1     n2
0  False  False
1   True  False
2   True   True

但是,我不知道如何使用此掩码将m中的相应df值设置为NaN

2 个答案:

答案 0 :(得分:2)

您可以使用pd.IndexSlice获取一个布尔ndarray,该布尔ndarray在级别NaN的{​​{1}}列中指示值是否为p,然后替换1False,并通过乘以结果来替换NaN中的值:

m

答案 1 :(得分:2)

您可以对转置后的数据帧进行堆叠和拆解,以便能够轻松选择和更改值,然后再次进行堆叠,拆解和转置以将其取回:

ToyVPN

第一行之后,df = df.T.stack(dropna=False).unstack(level=1) df.loc[df['p'].isna(), 'm'] = np.nan df = df.stack(dropna=False).unstack(1).T 是:

df

最后一次:

         m    p
n1 0   2.0  1.0
   1   6.0  NaN
   2  10.0  NaN
n2 0   4.0  3.0
   1   8.0  7.0
   2  12.0  NaN