熊猫的 pd.NA 与 np.nan

vas*_*111 14 python numpy dataframe pandas

pd.NAnp.nan与熊猫相比。哪一个与 pandas 一起使用以及为什么使用?它们与 pandas 的主要优点和缺点是什么?

一些使用它们的示例代码:

import pandas as pd
import numpy as np

df = pd.DataFrame({ 'object': ['a', 'b', 'c',pd.NA],
                   'numeric': [1, 2, np.nan , 4],
                    'categorical': pd.Categorical(['d', np.nan,'f', 'g'])
                 })
Run Code Online (Sandbox Code Playgroud)

输出:

|    | object   |   numeric | categorical   |
|---:|:---------|----------:|:--------------|
|  0 | a        |         1 | d             |
|  1 | b        |         2 | nan           |
|  2 | c        |       nan | f             |
|  3 | <NA>     |         4 | g             |
Run Code Online (Sandbox Code Playgroud)

Ner*_*xis 11

到目前为止(发布pandas-1.0.0)我真的建议谨慎使用它。

首先,它仍然是一个实验性功能:

实验性: 的行为pd.NA仍然可以在没有警告的情况下改变。

其次,行为不同于np.nan

与 相比np.nanpd.NA在某些操作中表现不同。除了算术运算之外,pd.NA还在比较运算中传播为“缺失”或“未知”。

发行说明中的两个配额

为了展示一些额外的例子,我对插值行为感到惊讶:

创建简单的数据帧:

df = pd.DataFrame({"a": [0, pd.NA, 2], "b": [0, np.nan, 2]})
df
#       a    b
# 0     0  0.0
# 1  <NA>  NaN
# 2     2  2.0
Run Code Online (Sandbox Code Playgroud)

并尝试插入:

df.interpolate()
#       a    b
# 0     0  0.0
# 1  <NA>  1.0
# 2     2  2.0
Run Code Online (Sandbox Code Playgroud)

有一些原因(我仍在发现),无论如何,我只想强调这些差异 -这是一个实验性功能,在某些情况下它的行为有所不同

我认为这将是非常有用的功能,但我会非常小心像“使用它而不是使用它应该完全没问题”这样的语句np.nan。在大多数情况下,这可能是正确的,但是当您不知道时可能会导致一些麻烦。

  • @BenJones是的,在最新版本(1.5)中,它仍然被认为是实验性的:https://pandas.pydata.org/pandas-docs/version/1.5/user_guide/missing_data.html#experimental-na-scalar-to-denote-缺失值 (5认同)
  • `pd.NA` 通常会非常令人惊讶。我最近用它来代替“np.nan”来指示缺失值,但该类型导致其他库反复破坏。值得注意的是,该库(Samplics)使用了“np.isfinite”以及“np.linalg”中的函数,它们都会引发有关数据形状和类型的错误。这些错误非常令人困惑。我使用的 pandas 版本为 1.5.3,NumPy 版本为 1.24.2 - 因此,如果有人想知道 2023 年“pd.NA”的状态,请确保您暂时留意有关其实验状态的警告,即使它倾向于工作顺利。 (5认同)

kso*_*all 5

根据文档

pd.NA 的目标是提供一个可以跨数据类型一致使用的“缺失”指标

因此,如果您有一列具有多种数据类型,则使用pd.NAelsenp.nan应该没问题。

然而,由于pd.NA似乎具有与 相同的功能,因此将其用于所有 nan 目的np.nan可能会更好pd.NA

现在只导入一次

  • `pd.NA` 不具有完全相同的功能,因此切换时要小心。`pd.NA` 在相等运算中传播,而 `np.nan` 则不会。`pd.NA == 1` 产生 `&lt;NA&gt;`,但 `np.nan == 1` 产生 `False`。 (8认同)

小智 5

pd.NA 和 np.nan 都表示数据框中的缺失值。
我注意到的主要区别是 np.nan 是浮点值,而 pd.NA 存储整数值。 如果数据集中的 column1 包含所有整数和一些缺失值,并且缺失值被 np.nan 替换,则该列的数据类型将变为浮点型,因为 np.nan 是浮点型。但是,如果数据集中的 column2 包含所有整数和一些缺失值,并且缺失值被 pd.NA 替换,则该列的数据类型仍然是整数,因为 pd.NA 是整数。如果您想将任何列保留为 int,而不是将其更改为 float,这可能很有用。


Cam*_*Cam 5

pd.NA 是镇上的新人,是 pandas 自己的空值。许多数据类型都是从 numpy 借用的,其中包括 np.nan。

\n

从 pandas 1.0 开始,实验性的 pd.NA 值(单例)可用于表示标量缺失值。此时,它用于可空整数布尔值和专用字符串数据类型中用作缺失值指示符。

\n

的目标pd.NA是提供一个 \xe2\x80\x9cmissing\xe2\x80\x9d 指示器,可以跨数据类型一致使用(而不是np.nan,Nonepd.NaT取决于数据类型)。

\n

让我们用所有不同的数据类型构建一个 df。

\n
d = {\'int\': pd.Series([1, None], dtype=np.dtype("O")),\n    \'float\': pd.Series([3.0, np.NaN], dtype=np.dtype("float")),\n    \'str\': pd.Series([\'test\', None], dtype=np.dtype("str")),\n    "bool": pd.Series([True, np.nan], dtype=np.dtype("O")),\n    "date": pd.Series([\'1/1/2000\', np.NaN], dtype=np.dtype("O"))}\ndf1 = pd.DataFrame(data=d)\n\ndf1[\'date\'] = pd.to_datetime(df1[\'date\'], errors=\'coerce\')\ndf1.info()\ndf1\n\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
<class \'pandas.core.frame.DataFrame\'>\nRangeIndex: 2 entries, 0 to 1\nData columns (total 5 columns):\n #   Column  Non-Null Count  Dtype         \n---  ------  --------------  -----         \n 0   int     1 non-null      object        \n 1   float   1 non-null      float64       \n 2   str     1 non-null      object        \n 3   bool    1 non-null      object        \n 4   date    1 non-null      datetime64[ns]\ndtypes: datetime64[ns](1), float64(1), object(3)\nmemory usage: 208.0+ bytes\n
Run Code Online (Sandbox Code Playgroud)\n
    int   float str     bool    date\n0   1     3.0   test    True    2000-01-01\n1   None  NaN   None    NaN     NaT\n\n
Run Code Online (Sandbox Code Playgroud)\n

如果您有一个使用传统类型的 DataFrame 或 Series,并且缺少使用 np.nan 表示的数据,则convert_dtypes()Series 和convert_dtypes()DataFrame 中有一些方便的方法可以将数据转换为对整数、字符串和布尔值以及 v1.2 浮点数使用较新的数据类型使用convert_integer=False

\n
df1[[\'int\', \'str\', \'bool\', \'date\']] = df1[[\'int\', \'str\', \'bool\', \'date\']].convert_dtypes()\ndf1[\'float\'] = df1[\'float\'].convert_dtypes(convert_integer=False)\ndf1.info()\ndf1\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
<class \'pandas.core.frame.DataFrame\'>\nRangeIndex: 2 entries, 0 to 1\nData columns (total 5 columns):\n #   Column  Non-Null Count  Dtype         \n---  ------  --------------  -----         \n 0   int     1 non-null      Int64         \n 1   float   1 non-null      Float64       \n 2   str     1 non-null      string        \n 3   bool    1 non-null      boolean       \n 4   date    1 non-null      datetime64[ns]\ndtypes: Float64(1), Int64(1), boolean(1), datetime64[ns](1), string(1)\nmemory usage: 200.0 bytes\n
Run Code Online (Sandbox Code Playgroud)\n
    int     float   str     bool    date\n0   1       3.0     test    True    2000-01-01\n1   <NA>    <NA>    <NA>    <NA>    NaT\n
Run Code Online (Sandbox Code Playgroud)\n

请注意大写“F”以区别于np.float32or np.float64,还要注意string哪个是新的 pandas StringDtype(来自 Pandas 1.0)而不是stror object。\n另外pd.Int64(来自 pandas 0.24)可空整数大写“I\”而不是 or 。np.int64

\n

有关数据类型的更多信息,请阅读此处此处此页面有一些有关子类型的好信息的好信息。

\n

我正在使用 pandas v1.2.4,因此希望我们能够及时为所有数据类型提供一个通用的 null 值,这将温暖我们的心。

\n

警告这是新的实验性使用,目前请小心。

\n


小智 4

pd.NA在最近发布的pandas-1.0.0.

我建议使用它 over np.nan,因为它包含在pandas库中,它应该与 DataFrames 配合使用效果最好。