Where 函数忽略 Nan

Where function ignoring Nan

我试图在忽略 Nan 的同时使用 where 函数,我不想删除或替换 Nans。

这里是玩具数据集:

df=pd.DataFrame({
                 'A':[8,39,40,52],
                 'B':[8,39,np.nan,50],
                 })

给出:

    A    B
0   8   8.0
1   39  39.0
2   40  NaN
3   52  50.0

想要的结果:

    A   B       check
0   8   8.0     True
1   39  39.0    True
2   40  NaN     Nan
3   52  50.0    False

我尝试了以下代码,但没有成功:

df = ((np.where(df['A']== df['B'], True, False))| df.isnull())

就做一个where:

df['A'].eq(df['B']).where(df[['A','B']].notna().all(1))

但是这会向下转换向上转换True, Falsefloat

您可以在任一列中有 NaN 的地方使用掩码,然后使用布尔掩码在其中插入 np.nan

m = df.isna().any(axis=1)
df['check'] = df['A'].eq(df['B'])
df.loc[m, 'check'] = np.nan # This would upcast bools to floats.

一种解决方法是使用 Series.astype.

check 列的数据类型设为 object
m = df.isna().any(axis=1)
df['check'] = df['A'].eq(df['B'])
df['check'] = df['check'].astype(object)
df.loc[m, 'check'] = np.nan

   A     B  check
0   8   8.0   True
1  39  39.0   True
2  40   NaN    NaN
3  52  50.0  False
#Using df.apply
import pandas as pd
import numpy as np

df=pd.DataFrame({
             'A':[8,39,40,52],
             'B':[8,39,np.nan,50],
             })
def check(df):

    if not (pd.isnull(df["A"]) or pd.isnull(df["B"])):
        if df["A"]==df["B"]:
            return "True"
        else:
            return "False"
    else:
        return "Nan"
df["check"]=""
df["check"]=df.apply(check,axis=1)
print(df)

output:
    A     B  check
0   8   8.0   True
1  39  39.0   True
2  40   NaN    Nan
3  52  50.0  False