簡體   English   中英

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

[英]Boolean indexing in Pandas DataFrame with MultiIndex columns

我有一個帶有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

現在我想將p設置為NaN時將m設置為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

但是,我不知道如何使用此掩碼將df的相應m值設置為NaN

您可以使用pd.IndexSlice獲取一個布爾pd.IndexSlice ,該布爾ndarray指示級別1p列中的值是否為NaN ,然后將False替換為NaN ,還可以通過將結果相乘來替換m的值:

x = df.loc[:, pd.IndexSlice[:,'p']].notna().replace({False:float('nan')}).values
df.loc[:, pd.IndexSlice[:,'m']] *= x

       n1        n2     
     p    m    p    m
0  1.0    2  3.0    4
1  NaN  NaN  7.0    8
2  NaN  NaN  NaN  NaN

您可以對轉置后的數據幀進行堆棧和拆棧,以便能夠輕松地選擇和更改值,然后再次進行堆棧,拆棧和轉置以將其取回:

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

之后:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM