np.where
对于 pandas 来说非常有用,因为它是一种根据条件更改列的矢量化方式。
但是,虽然它似乎与
np
原生类型配合得很好,但它与日期配合得不太好。
这效果很好:
>>> df1 = pd.DataFrame([["a", 1], ["b", np.nan]], columns=["name", "num"])
>>> df1
name num
0 a 1.0
1 b NaN
>>> np.where(df1["num"] < 2, df1["num"], np.nan)
array([ 1., nan])
但这不是:
>>> df2 = pd.DataFrame([["a", datetime.datetime(2024,1,2)], ["b", np.nan]], columns=["name", "date"])
>>> df2
name date
0 a 2024-01-02
1 b NaT
>>> np.where(df["date"] < datetime.datetime(2024,3,1), df["date"], np.nan)
Traceback (most recent call last):
File "<python-input-10>", line 1, in <module>
np.where(df["date"] < datetime.datetime(2024,3,1), df["date"], np.nan)
~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
numpy.exceptions.DTypePromotionError: The DType <class 'numpy.dtypes.DateTime64DType'> could not be promoted by <class 'numpy.dtypes._PyFloatDType'>. This means that no common DType exists for the given inputs. For example they cannot be stored in a single array unless the dtype is `object`. The full list of DTypes is: (<class 'numpy.dtypes.DateTime64DType'>, <class 'numpy.dtypes._PyFloatDType'>)
>>>
执行后一个操作的正确矢量化方法是什么?
numpy.where
返回具有单个数据类型的数组,您不应该使用 NaN
作为空值,而应使用 NaT
:
np.where(df2["date"] < datetime.datetime(2024,3,1), df2["date"], pd.NaT)