如何根据df2的布尔值将df1每行最后2列设为NA?
根据布尔Series设置DataFrame指定列值为NaN
问题背景
现有如下DataFrame df1:
import pandas as pd import numpy as np df1 = pd.DataFrame(data={'col1': ['a', 'd', 'g', 'j'], 'col2': ['b', 'c', 'i', np.nan], 'col3': ['c', 'f', 'i', np.nan], 'col4': ['x', np.nan, np.nan, np.nan]}, index=pd.Series(['ind1', 'ind2', 'ind3', 'ind4'], name='index'))
| index | col1 | col2 | col3 | col4 |
|---|---|---|---|---|
| ind1 | a | b | c | x |
| ind2 | d | c | f | NaN |
| ind3 | g | i | i | NaN |
| ind4 | j | NaN | NaN | NaN |
以及布尔Series df2:
df2 = pd.Series(data=[True, False, True, False], index=pd.Series(['ind1', 'ind2', 'ind3', 'ind4']))
| ind1 | True |
| ind2 | False |
| ind3 | True |
| ind4 | False |
需要实现:根据df2的布尔值,将df1中对应索引行的最后2列设置为NaN,最终得到如下结果:
| index | col1 | col2 | col3 | col4 |
|---|---|---|---|---|
| ind1 | a | b | NaN | NaN |
| ind2 | d | c | f | NaN |
| ind3 | g | i | NaN | NaN |
| ind4 | j | NaN | NaN | NaN |
解决方案
方法1:通用写法(适配任意列名)
使用df1.columns[-2:]选取最后两列,结合loc和df2的布尔索引直接赋值:
df1.loc[df2, df1.columns[-2:]] = np.nan
这个方法不需要硬编码列名,即使后续df1的列数或列名变化,依然能精准定位最后两列。
方法2:指定列名写法(列名固定时使用)
如果确定最后两列是col3和col4,可以直接指定列名列表:
df1.loc[df2, ['col3', 'col4']] = np.nan
验证结果
执行上述代码后,打印df1即可看到目标输出:
print(df1)
输出:
col1 col2 col3 col4 index ind1 a b NaN NaN ind2 d c f NaN ind3 g i NaN NaN ind4 j NaN NaN NaN
内容的提问来源于stack exchange,提问作者bltSandwich21
相关产品推荐
相关产品推荐

