Python 更改默认的NA类型促销

Python 更改默认的NA类型促销,python,pandas,casting,Python,Pandas,Casting,我有一个特殊的例子,输入中有巨大的整数 而float64中的转换实际上改变了值 根据本页: Pandas自动将带有NA的整数转换为浮点64 问题是,当我的输入中有NA值时,即使我在构造函数中指定了'Int64',pandas也会自动将其强制转换为'float64' 我用pandas 1.0.1和python 3.8.1编写了一个repl.it脚本,其中显示了我的用例: 对于那些不想玩的人,我基本上是这样做的: test_df =[ {'dataset_id': 327626200612

我有一个特殊的例子,输入中有巨大的整数 而float64中的转换实际上改变了值

根据本页: Pandas自动将带有NA的整数转换为浮点64

问题是,当我的输入中有NA值时,即使我在构造函数中指定了
'Int64'
,pandas也会自动将其强制转换为
'float64'

我用pandas 1.0.1和python 3.8.1编写了一个repl.it脚本,其中显示了我的用例:

对于那些不想玩的人,我基本上是这样做的:

test_df =[
    {'dataset_id': 327626200612520493}, 
    {'dataset_id': 327626200612520493}, 
]
df = DataFrame(data=test_df, columns=['dataset_id'])
如果我这样做了

print(df[col_name])
输出为:

0    327626200612520493
1    327626200612520493
Name: dataset_id, dtype: int64
哪个是正确的

但是,如果我这样做

print(df[col_name].astype('float').astype('Int64'))
我有以下输出:

0    327626200612520512
1    327626200612520512
Name: dataset_id, dtype: Int64
哪个是错误的

主要问题是当您使用NA输入创建数据帧时,如下所示:

#test with a NA value in DF, showing how Pandas automatically cast to `'float64'`
test_with_nan_df =[
    {'dataset_id': 327626200612520493}, 
    {'dataset_id': None}
]
df_w_nan = DataFrame(data=test_with_nan_df, columns=['dataset_id'])
print(df_w_nan[col_name].astype('Int64'))

输出相同:

0    327626200612520512
1                  <NA>
Name: dataset_id, dtype: Int64
0 327626200612520512
1.
名称:dataset_id,数据类型:Int64
正如您可能看到的,即使我在创建数据帧期间强制执行
'Int64'
,它仍然是错误的值,我想在将列强制转换为
'Int64'
之前,我会先将列强制转换为
'float'

因此如果我对熊猫的使用是正确的,我想写一个补丁来覆盖NA类型提升的方法

有人已经这么做了吗?甚至有可能吗


关于,

您可以使用
对象
确保pandas保持数据不变。然后可以手动设置类型

pd.DataFrame(data=test_with_nan_df, columns=['dataset_id'], dtype='object').astype('Int64')
#           dataset_id
#0  327626200612520493
#1                 NaN

#dataset_id    Int64

如果我不想知道输入中每一列的类型,对象类型比Int64消耗的内存要多,不是吗?更改NA类型升级将有助于创建正确的类型,并消耗更少的内存Iguess@RonanT是的,我绝对同意。我希望有人能想出一个稍微好一点的答案。像ID和邮政编码这样的数字(需要保留前导0的东西)总是有问题的。您可以只将这些列指定为
str
,然后只转换它们,而不是弄乱整个数据帧。大多数
pd.read…
将允许您为每一列指定不同的数据类型。@RonanT另一方面,我不确定
Int64
是否一定比
对象
占用更少的内存。特别是如果你不打算和他们一起做数学运算,那么可能不完全需要转换。我不确定其他操作的性能,如合并或映射。是的,我也不确定:p但让我们举个例子,我知道一个特定的输入可能在一个未知列中包含巨大的int和NA。我想更改这个特殊情况下的默认类型升级,而不是强制每个列都使用object,然后尝试猜测每个列的每个类型,因为除了这种情况,pandas对我来说做得非常好!
pd.DataFrame(data=test_with_nan_df, columns=['dataset_id'], dtype='object').astype('Int64')
#           dataset_id
#0  327626200612520493
#1                 NaN

#dataset_id    Int64