【问题标题】:Where function ignoring Nanwhere 函数忽略 Nan
【发布时间】:2021-06-15 03:28:46
【问题描述】:

我正在尝试使用 where 函数而忽略 Nan,我不希望删除或替换 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']== df['B'] 一样好。

标签: python pandas numpy nan


【解决方案1】:

您可以在任一列中有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.astypecheck 列的dtype 设为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

【讨论】:

    【解决方案2】:

    只需做一个where

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

    但这会 downcastTrue, False 向上转换为float

    【讨论】:

    • @Ch3steR 感谢您指出这一点。已更新。
    • 使用astype(object) 可以防止df.assign(check=(df['A'] == df['B']).astype(object).mask(df.isnull().any(1))) 的强制转换
    【解决方案3】:
    #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
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 2019-02-09
      • 2018-07-05
      • 1970-01-01
      • 2017-11-24
      • 2015-04-03
      • 2018-07-05
      • 2019-09-24
      相关资源
      最近更新 更多