首页 > 解决方案 > 如果条件包含在 Nan(s) 的理解列表中

问题描述

我有一个包含两个日期列的数据框,我试图在工作日内获得它们之间的延迟。这些列包含 NaN 值。

import pandas as pd
import numpy as np

data = pd.DataFrame({
    'date1' : [np.nan, np.nan, "2021-05-26", "2021-06-25", "2021-06-30"],
        'date2' : [np.nan, np.nan, "2021-06-30", "2021-06-28", "2021-06-30"]
    })
    
>>> data
    
    date1       date2
0   NaN         NaN
1   NaN         NaN
2   2021-05-26  2021-06-30
3   2021-06-25  2021-06-28
4   2021-06-30  2021-06-30

因此,在创建具有延迟的新列时,我试图忽略具有 NaN 值的行。我正在使用列表推导来做到这一点,if 条件有另一个值(这里为 0)而不是 NaN。

但是我的列表理解似乎不起作用,因为发生了同样的错误,说该方法无法处理 NaN。然后似乎我没有用我的 if 条件忽略 NaN ......但我不知道该怎么做。

我正在使用以下方法:pd.bdate_range()

data["delay"] = [len(pd.bdate_range(x,y)) for x,y in zip(data.date1,\
                                    data.date2) if (x,y) != np.isnan]


---------------------------------------------------------------------------
...

ValueError: Neither `start` nor `end` can be NaT

我尝试添加一个 else 条件,但它也不起作用。

标签: pythonpandasdatetimelist-comprehensionnan

解决方案


你的情况if (x,y) != np.isnan并不像你认为的那样。首先,np.isnan是一个函数,因此您正在针对函数引用执行日期时间元组的相等性检查。其次,np.nan == np.nanFalse- 不要对NaN对象进行相等比较,NaN首先过滤你的数据框,然后应用你的函数(不要使用理解):

mask = ~df.isnull().any(axis=1)
df["delay"] = df[mask].apply(lambda r: len(pd.bdate_range(r.date1, r.date2)), axis=1)

如果任何行有NaT,它们将NaNdelay列中。


推荐阅读