我有以下几个布尔值表:
df1 = pd.DataFrame(data={'a': [True, False, False],
'b': [False, True, False]},
index=pd.Series([1, 2, 3], name='index'))
df2 = pd.DataFrame(data={'w': [True, False, False],
'x': [False, True, False],
'y': [True, True, True],
'z': [True, False, True]},
index=pd.Series([1, 2, 3], name='index'))
<表类>指数 b tbody><<tr>1 对 假 2假 对 3 假 假 表类>
如果您只有True
/False
,只需要将True
更改为False
,这个简单的屏蔽循环应该为您工作:
NB。我将字典dic
称为dict
, python内置用于构造字典
for k,v in dic.items():
df2[v] = df2[v].mask(df1[k], False)
输出:
w x y z
index
1 False False True True
2 False True False False
3 False False True True
我们可以将字典中的键值关联反向到rename
df2
,以便列与df1
中的名称对齐。然后,使用mask
来更新值(按列对齐),使用set_axis
来恢复列名:
# Avoiding using `dict` as a variable name
d = {'a': ['w', 'x'], 'b': ['y', 'z']}
df2 = (
df2.rename(columns={v: k for k, lst in d.items() for v in lst})
.mask(df1, False)
.set_axis(df2.columns, axis=1)
)
df2
:
w x y z
index
1 False False True True
2 False True False False
3 False False True True