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.nan,pd.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。在大多数情况下,这可能是正确的,但是当您不知道时可能会导致一些麻烦。
小智 5
pd.NA 和 np.nan 都表示数据框中的缺失值。
我注意到的主要区别是 np.nan 是浮点值,而 pd.NA 存储整数值。
如果数据集中的 column1 包含所有整数和一些缺失值,并且缺失值被 np.nan 替换,则该列的数据类型将变为浮点型,因为 np.nan 是浮点型。但是,如果数据集中的 column2 包含所有整数和一些缺失值,并且缺失值被 pd.NA 替换,则该列的数据类型仍然是整数,因为 pd.NA 是整数。如果您想将任何列保留为 int,而不是将其更改为 float,这可能很有用。
pd.NA 是镇上的新人,是 pandas 自己的空值。许多数据类型都是从 numpy 借用的,其中包括 np.nan。
\n从 pandas 1.0 开始,实验性的 pd.NA 值(单例)可用于表示标量缺失值。此时,它用于可空整数、布尔值和专用字符串数据类型中用作缺失值指示符。
\n的目标pd.NA是提供一个 \xe2\x80\x9cmissing\xe2\x80\x9d 指示器,可以跨数据类型一致使用(而不是np.nan,None或pd.NaT取决于数据类型)。
让我们用所有不同的数据类型构建一个 df。
\nd = {\'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\nRun 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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n如果您有一个使用传统类型的 DataFrame 或 Series,并且缺少使用 np.nan 表示的数据,则convert_dtypes()Series 和convert_dtypes()DataFrame 中有一些方便的方法可以将数据转换为对整数、字符串和布尔值以及 v1.2 浮点数使用较新的数据类型使用convert_integer=False。
df1[[\'int\', \'str\', \'bool\', \'date\']] = df1[[\'int\', \'str\', \'bool\', \'date\']].convert_dtypes()\ndf1[\'float\'] = df1[\'float\'].convert_dtypes(convert_integer=False)\ndf1.info()\ndf1\nRun 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\nRun 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\nRun 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我正在使用 pandas v1.2.4,因此希望我们能够及时为所有数据类型提供一个通用的 null 值,这将温暖我们的心。
\n警告这是新的实验性使用,目前请小心。
\n| 归档时间: |
|
| 查看次数: |
7480 次 |
| 最近记录: |