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