python - 如果条件包含在 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 条件,但它也不起作用。
解决方案
你的情况if (x,y) != np.isnan
并不像你认为的那样。首先,np.isnan
是一个函数,因此您正在针对函数引用执行日期时间元组的相等性检查。其次,np.nan == np.nan
是False
- 不要对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
,它们将NaN
在delay
列中。
推荐阅读
- python - 如何提高模糊图像的图像质量
- woocommerce - 如何通过多维数组以编程方式创建多达 3-5 个变体的 woocommerce 变体
- postgresql - 有没有办法在聚合调用中不使用 ORDER BY 对 postgresql 自定义聚合中的行进行预排序?
- r - 如何在 R 中进行循环计算?
- python - 处理 WSGI 脚本 Flask Apche2 EC2 发生异常
- javascript - 使用moment和lodash按月和周进行数据聚合 - Javascript
- r - 如何计算出用于负二项式 GLM 的数据的 theta 值?
- pytorch - 如何将自定义 PyTorch 模型 (model.pt) 转换为 Huggingface Transformers 模型,以便使用 from_pretrained() 加载它?
- django - AttributeError:'list' 对象没有属性'split' Django Haystack Solr
- javascript - 在reduce中将空数组设置为空数组中的初始值