numpy
数组的数据类型固定为int
(或int64
或其他),同时仍将元素内部列出为numpy.NaN
?特别是,我正在将in内部数据结构转换为Pandas DataFrame。在我们的结构中,我们有仍然具有NaN的整数类型的列(但该列的dtype是int)。如果将其设为DataFrame,似乎可以将所有内容重播为浮点数,但我们真的很想成为
int
。思路?
尝试过的事情:
我尝试将pandas.DataFrame下的
from_records()
函数与coerce_float=False
一起使用,但这没有帮助。我还尝试使用带有NaN fill_value的NumPy蒙版数组,该数组也无法正常工作。所有这些导致列数据类型变为浮点型。#1 楼
此功能已添加到熊猫(从0.24版开始): support此时,它需要使用扩展名dtype Int64(大写),而不是默认的dtype int64(小写)。
评论
现在,您必须指定一个特殊的dtype(如“ Int64”)使其起作用。默认情况下启用它会更好。
–让·保罗(Jean Paul)
19年1月23日在13:42
这很棒!虽然存在一个小问题,但如果使用这种方式,PyCharm无法在调试窗口中显示数据框。您可以看到我对另一个问题的答案,即如何强制显示它:stackoverflow.com/questions/38956660/…(原始问题有所不同,但显示数据框的解决方案有效)
– Alaa M.
19年5月10日在14:36
我必须使用“ Int64”还是“ Int8”之类的东西?与np.float相比,它使用了大量的内存。
– Superdooperhero
19-10-7在20:30
'Int8'似乎可以工作,但是np.float似乎仍然可以更快地加载。问题似乎在于它之间没有释放内存。假设垃圾收集器最终将运行。
– Superdooperhero
19年10月7日在20:33
#2 楼
NaN
无法存储在整数数组中。目前,这是熊猫的已知限制;我一直在等待NumPy中的NA值(类似于R中的NA)取得进展,但是NumPy至少需要6个月到一年的时间才能获得这些功能,这似乎是:http://pandas.pydata.org/pandas-docs/stable/gotchas.html#support-for-integer-na
(此功能是从熊猫0.24版开始添加的,但请注意它需要使用扩展名dtype Int64(大写),而不是默认的dtype int64(小写):
https://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0 .html#optional-integer-na-support
)
评论
您好Wes,对此有任何更新吗?根据原始列表中是否存在NA值,我们遇到了将联接列转换为int或float的问题。 (稍后在尝试合并这些数据框时创建问题)
–卡斯特
13年7月23日在21:36
更新的链接:pandas-docs.github.io/pandas-docs-travis/whatsnew / ...
– techvslife
18/12/19在15:40
#3 楼
如果性能不是主要问题,则可以存储字符串。df.col = df.col.dropna().apply(lambda x: str(int(x)) )
然后,您可以根据需要将其与
NaN
混合使用。如果您确实希望拥有整数,则可以根据应用程序使用-1
或0
或1234567890
或其他一些专用值来表示NaN
。 您还可以临时复制列:如您所愿,带有浮点数;另一个是实验型,带有整数或字符串。然后在每个合理的位置插入
asserts
,以确保两者同步。经过足够的测试后,您可以放开浮子。 #4 楼
这不是对所有情况都适用的解决方案,但是我的(基因座标)我一直使用0作为NaNa3['MapInfo'] = a3['MapInfo'].fillna(0).astype(int)
这至少允许使用适当的“本机” '要使用的列类型,减法,比较等操作将按预期工作
#5 楼
Pandas v0.24 +v0.24或更高版本将支持整数系列中的
NaN
。 v0.24的“新增功能”部分提供了有关此信息,而Nullable Integer数据类型下提供了更多详细信息。熊猫v0.23和更早版本
最好在可能的情况下与
float
系列配合使用,即使由于包含int
值而将该系列从float
转换为NaN
也是如此。这将启用基于矢量的基于NumPy的计算,否则将处理Python级别的循环。文档确实建议:“一种可能性是使用
dtype=object
数组。”例如:s = pd.Series([1, 2, 3, np.nan])
print(s.astype(object))
0 1
1 2
2 3
3 NaN
dtype: object
出于装饰性原因,例如
熊猫v0.23及更早版本:background
NaN
被认为是float
。当前的文档(自v0.23开始)指定了将整数系列向上转换为float
的原因:由于缺乏高性能,NA的NumPy
内置了NA支持。从根本上讲,主要的伤亡是能够以整数数组表示NA。
这种权衡主要是出于内存和性能的原因,并且
由于
NaN
包含,文档还提供了向上转换的规则:Typeclass Promotion dtype for storing NAs
floating no change
object no change
integer cast to float64
boolean cast to object
#6 楼
现在这已经成为可能,因为pandas v 0.24.0pandas 0.24.x发行说明
引用:“ Pandas获得了持有缺失值的整数dtypes的能力。
#7 楼
只是想补充一下,以防您试图将浮点数(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
我的用例是我有一个float系列我想四舍五入为整数,但是当您执行.round()时,数字末尾仍为'* .0',因此您可以通过转换为int从末尾删除该0。
#8 楼
如果文本数据中有空格,则通常为整数的列将转换为float64 dtype,因为int64 dtype无法处理null。如果您要加载多个文件,其中一些带有空白(最终将以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
评论
你可以使用一个numpy的蒙版数组吗?我会尝试的。我还尝试了pandas.DataFrame下的from_records函数,带有coerce_float = False,但是没有运气...它仍然使新数据的类型为float64。
是的,没有运气。即使使用蒙版数组,它仍会转换为浮点数。熊猫看起来像这样:“哪里有NaN吗?……然后一切都是浮空的。”希望有办法解决这个问题。
可选的Nullable Integer支持现已在熊猫0.24.0上正式添加-最终:)-请在下面找到更新的答案。 pandas 0.24.x发行说明