[英]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
我知道如何找出p
是NaN
,例如使用
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指示級別1
的p
列中的值是否為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.