Pandas 基于同一数据帧中其他列中的值创建包含布尔值或NaN值的新列

Pandas 基于同一数据帧中其他列中的值创建包含布尔值或NaN值的新列,pandas,Pandas,我想在pandas数据框中创建一个新列,根据同一数据框中其他两列中的值计算为True、False或NaN,这两列也只包含True、False或NaN值。具体来说,如下所示,新列中的行值应为: (a) 如果其中一个引用列值为True, (b) 如果两个引用列值都为False,或者它们是False和NaN的组合,则为False;或者 (c) 如果两个引用列值均为NaN,则为NaN 列A+列B=>新列(所需值) 真+真=>真 真+假=>真 True+NaN=>True False+False=>Fa

我想在pandas数据框中创建一个新列,根据同一数据框中其他两列中的值计算为True、False或NaN,这两列也只包含True、False或NaN值。具体来说,如下所示,新列中的行值应为: (a) 如果其中一个引用列值为True, (b) 如果两个引用列值都为False,或者它们是False和NaN的组合,则为False;或者 (c) 如果两个引用列值均为NaN,则为NaN

列A+列B=>新列(所需值)

  • 真+真=>真
  • 真+假=>真
  • True+NaN=>True
  • False+False=>False
  • False+NaN=>False
  • NaN+NaN=>NaN
最初,如下图所示,我尝试将值赋给col_A或col_B为True的新列,但可以理解的是,当一列或两列都包含NaN时,它返回False

df[new_col] = df[col_A] | df[col_B]
我还研究了如何为列a和列B都为NaN的行创建一个返回True的列,但我仍在努力找出下一步

df[new_col] = pd.isnull(df[col_A]) & pd.isnull(df[col_B]) 
我觉得我最终可以使用for循环/if语句获得正确的输出,但我的理解是这将是非常低效的,而且似乎应该有一种更高效/直接的方法来获得我想要的结果。

使用

设置数据帧:

dict = {
    'col_A': [True, True, True, False, False, False, np.NaN, np.NaN, np.NaN], 
    'col_B': [True, False, np.NaN, False, True, np.NaN, np.NaN,True, False]   
       }
df = pd.DataFrame(dict)

print(df)

   col_A  col_B
0   True   True
1   True  False
2   True    NaN
3  False  False
4  False   True
5  False    NaN
6    NaN    NaN
7    NaN   True
8    NaN  False
创建一个新列并将所有值设置为false。我们将填写其他值

df['new_col'] = False
使用.any()填充剩余的True和NaN值

df.loc[df[['col_A', 'col_B']].any(1), 'new_col'] = True
打印(df)


这让我很接近,因为所有的真值都得到了正确的解释,但如第6行所示,当两者都是NaN时,结果仍然是False而不是NaN。为了解决这个问题,我插入了
df.loc[df[['col\u A','col\u B']]].isnull().all(1),'new\u col']=np.nan
,它解决了这个问题,但创建了另一个小问题,因为新_col中的值随后显示为1/0/nan,而不是True/False/nan。因此,为了保持一致性,我最后使用了以下代码将1/0重新转换为True/False
df_dict={1:True,0:False}
df['new_col']=df['new_col'].map(df_dict)
   col_A   col_B   new_col
0   True   True     True
1   True  False     True
2   True    NaN     True
3  False  False    False
4  False   True     True
5  False    NaN    False
6    NaN    NaN    False
7    NaN   True     True
8    NaN  False    False