NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值

2024-12-12 08:41:00
admin
原创
148
摘要:问题描述:是否有一种首选方法可以使数组的数据类型numpy固定为int(或int64或其他),同时仍将其中的元素列为numpy.NaN?具体来说,我正在将内部数据结构转换为 Pandas DataFrame。在我们的结构中,我们有整数类型的列,这些列仍然有 NaN(但列的 dtype 是 int)。如果我们将...

问题描述:

是否有一种首选方法可以使数组的数据类型numpy固定为int(或int64或其他),同时仍将其中的元素列为numpy.NaN

具体来说,我正在将内部数据结构转换为 Pandas DataFrame。在我们的结构中,我们有整数类型的列,这些列仍然有 NaN(但列的 dtype 是 int)。如果我们将其设为 DataFrame,它似乎会将所有内容重新转换为浮点数,但我们确实希望如此int

有什么想法吗?

尝试过的事情:

我尝试使用from_records()pandas.DataFrame 下的函数,coerce_float=False但这没有帮助。我还尝试使用 NumPy 掩码数组,使用 NaN fill_value,这也不起作用。所有这些都导致列数据类型变成浮点数。


解决方案 1:

NaN无法存储在整数数组中。这是目前 pandas 的一个已知限制;我一直在等待 NumPy 中 NA 值的进展(类似于 R 中的 NA),但看起来 NumPy 至少需要 6 个月到一年的时间才能获得这些功能:

http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na

(此功能从 pandas 0.24 版开始添加,但请注意,它需要使用扩展 dtype Int64(大写),而不是默认 dtype int64(小写):
https: //pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html#optional-integer-na-support

解决方案 2:

从0.24 版开始,pandas 中已经添加了此功能。

此时,需要使用扩展 dtype 'Int64'(大写),而不是默认 dtype 'int64'(小写)。

解决方案 3:

如果您尝试将浮点 (1.143) 向量转换为整数 (1),并且该向量有 NA,则将其转换为新的“Int64”dtype 会出错。为了解决这个问题,您必须对数字进行四舍五入,然后执行“.astype('Int64')”

s1 = pd.Series([1.434, 2.343, np.nan])
#without round() the next line returns an error 
s1.astype('Int64')
#cannot safely cast non-equivalent float64 to int64
##with round() it works
s1.round().astype('Int64')
0      1
1      2
2    NaN
dtype: Int64

我的用例是,我有一个浮点数系列,我想将其四舍五入为 int,但是当执行 .round() 时仍然有小数,因此需要转换为 int 以删除小数。

解决方案 4:

如果性能不是主要问题,您可以存储字符串。

df.col = df.col.dropna().apply(lambda x: str(int(x)) )

然后,您可以将 和 混合NaN,只要您愿意。如果您确实想要整数,则根据您的应用程序,您可以使用-1、 或0、 或1234567890或其他专用值来表示NaN

您还可以临时复制列:一个与您已有的一样,使用浮点数;另一个是实验性的,使用整数或字符串。然后asserts在每个合理的位置插入,检查两者是否同步。经过足够的测试后,您可以放弃浮点数。

解决方案 5:

这不是所有情况的解决方案,但我的(基因组坐标)我已使用 0 作为 NaN

a3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)

这至少允许使用正确的“本机”列类型,减法、比较等操作可以按预期工作

解决方案 6:

Pandas v0.24+

支持NaN整数系列的功能将在 v0.24 及以上版本中提供。v0.24 “新功能”部分提供了相关信息,可空整数数据类型下提供了更多详细信息。

Pandas v0.23 及更早版本

一般而言,最好尽可能使用float系列,即使系列由于包含值而从int向上转换到也是如此。这样可以实现基于 NumPy 的矢量化计算,否则将处理 Python 级循环。float`NaN`

文档确实建议:“一种可能性是使用dtype=object数组来代替。”例如:

s = pd.Series([1, 2, 3, np.nan])

print(s.astype(object))

0      1
1      2
2      3
3    NaN
dtype: object

出于美观的原因,例如输出到文件,这可能是更好的选择。

Pandas v0.23 及更早版本:背景

NaN被视为float。文档目前(截至 v0.23)指定了整数系列被上溯到 的原因float

由于 NumPy 缺乏从头开始内置的高性能 NA 支持,因此主要损害就是无法用整数数组表示 NA。

这种权衡主要是出于内存和性能的原因,同时也为了让结果系列继续保持“数字”性质。

该文档还提供了因包含而进行的向上转型规则NaN

Typeclass   Promotion dtype for storing NAs
floating    no change
object      no change
integer     cast to float64
boolean     cast to object

解决方案 7:

Pandas v1.00 的新功能 +

您不再(也不能)使用numpy.nan。现在您有pandas.NA

请阅读:https ://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html

IntegerArray 目前处于实验阶段。其 API 或实现可能会在未经警告的情况下发生变化。

在 1.0.0 版更改: 现在使用 pandas.NA 作为缺失值,而不是 numpy.nan。

在处理缺失数据中,我们看到 Pandas 主要使用 NaN 来表示缺失数据。由于 NaN 是浮点数,因此这会强制将包含任何缺失值的整数数组转换为浮点数。在某些情况下,这可能并不重要。但如果您的整数列是标识符,则转换为浮点数可能会有问题。有些整数甚至不能表示为浮点数。

解决方案 8:

如果文本数据中有空格,则通常为整数的列将转换为浮点数作为 float64 dtype,因为 int64 dtype 无法处理空值。如果您加载多个文件,其中一些文件带有空格(最终将为 float64,而其他没有空格的文件将为 int64),这可能会导致架构不一致

此代码将尝试将任何数字类型列转换为 Int64(而不是 int64),因为 Int64 可以处理空值

import pandas as pd
import numpy as np

#show datatypes before transformation
mydf.dtypes

for c in mydf.select_dtypes(np.number).columns:
    try:
        mydf[c] = mydf[c].astype('Int64')
        print('casted {} as Int64'.format(c))
    except:
        print('could not cast {} to Int64'.format(c))

#show datatypes after transformation
mydf.dtypes

解决方案 9:

我知道 OP 只要求 NumPy 或 Pandas,但我认为值得一提的是,polars是支持所请求功能的替代方案。

Polars整数列中的任何缺失值都只是值null,并且该列仍然是整数列。

请参阅Polars - 用户指南 > 来自 Pandas以了解更多信息。

解决方案 10:

从 pandas v 0.24.0 开始,这已经成为可能

pandas 0.24.x 发行说明
引用:“ Pandas 已经获得了保存具有缺失值的整数数据类型的能力。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用