Python 更改默认的NA类型促销
我有一个特殊的例子,输入中有巨大的整数 而float64中的转换实际上改变了值 根据本页: Pandas自动将带有NA的整数转换为浮点64 问题是,当我的输入中有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
'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