我有一个带有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
现在,我想在m
为NaN
时将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
我知道如何找出p
在NaN
的位置,例如使用
mask = df.xs('p', level=1, axis=1).isnull()
n1 n2
0 False False
1 True False
2 True True
但是,我不知道如何使用此掩码将m
中的相应df
值设置为NaN
。
答案 0 :(得分:2)
您可以使用pd.IndexSlice
获取一个布尔ndarray,该布尔ndarray在级别NaN
的{{1}}列中指示值是否为p
,然后替换1
到False
,并通过乘以结果来替换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