商城首页欢迎来到中国正版软件门户

您的位置:首页 >Pandas处理含None的整数数组技巧

Pandas处理含None的整数数组技巧

  发布于2026-01-28 阅读(0)

扫一扫,手机访问

Pandas中处理含None值的整数数组:保持整数类型而非自动转换为浮点数

在Pandas中,当数组包含None值并加载到DataFrame列时,整数通常会被自动转换为浮点数(NaN)。本文将介绍如何利用Pandas 1.0及更高版本引入的pd.NA和Int64Dtype,优雅地解决这一问题,从而在包含缺失值的同时保持列的整数类型,避免不必要的类型转换。

1. 问题背景:Pandas的默认类型推断

在处理包含缺失值的数值数据时,Pandas的默认行为可能会导致数据类型发生意外转换。具体来说,当一个数组中同时存在整数和None(或np.nan)时,Pandas为了保持列内数据类型的一致性,会将整个列转换为浮点数类型。这是因为传统的整数类型(如int64)无法表示缺失值,而浮点数类型可以表示NaN(Not a Number)。

考虑以下示例,一个包含None和整数的列表被加载到Pandas DataFrame中:

import pandas as pd

the_array = [None, None, None, 101, 555, 756, 924, 485]

df = pd.DataFrame(columns=['request'])
df['request'] = the_array

print(df)
print(df.dtypes)

输出结果将显示:

   request
0      NaN
1      NaN
2      NaN
3    101.0
4    555.0
5    756.0
6    924.0
7    485.0

request    float64
dtype: object

可以看到,原始的None值被转换为NaN,而所有整数值都被转换为浮点数(例如,101变为101.0),列的数据类型也变成了float64。这在某些场景下可能不是期望的行为,特别是在需要严格保持整数类型或避免浮点数精度问题时。

2. 解决方案:引入 pd.NA 和 Int64Dtype

为了解决上述问题,Pandas在1.0.0版本中引入了pd.NA这一实验性的缺失值指示符,并提供了支持可空数据类型的扩展Dtype。其中,pd.Int64Dtype(或其字符串别名'Int64')允许整数列包含缺失值,而无需将整个列转换为浮点数。

  • pd.NA: 这是一个新的、通用的缺失值指示符,旨在与所有Pandas的可空Dtype兼容,包括整数、布尔和字符串类型。它与np.nan不同,np.nan主要用于浮点数。
  • pd.Int64Dtype: 这是一个专门用于表示64位整数的可空Dtype。当使用此Dtype时,列中的None或np.nan值将被pd.NA替换,而整数值将保持其整数形式。

3. 实际操作:使用 dtype='Int64'

要实现包含None值的整数列而不进行浮点数转换,只需在创建DataFrame或Series时,通过dtype参数指定为'Int64'即可。

import pandas as pd

the_array = [None, None, None, 101, 555, 756, 924, 485]

# 在创建DataFrame时指定dtype为 'Int64'
df = pd.DataFrame(
    data=the_array,
    columns=["request"],
    dtype="Int64",  # 使用字符串别名指定可空整数Dtype
)
print(df)
print(df.dtypes)

运行上述代码,你将得到以下输出:

   request
0     <NA>
1     <NA>
2     <NA>
3      101
4      555
5      756
6      924
7      485

request    Int64
dtype: object

从输出可以看出:

  • None值被替换为<NA>,这是pd.NA在打印时的表示形式。
  • 整数值保持了其原始的整数形式,没有被转换为浮点数。
  • 列的数据类型显示为Int64,表明它是一个可空的64位整数类型。

4. 注意事项与最佳实践

  • Pandas版本要求:pd.NA和可空Dtype是在Pandas 1.0.0及更高版本中引入的。如果使用旧版本Pandas,此方法将不可用。
  • NaN与<NA>的区别:NaN是浮点数类型中的缺失值,其类型为float。而<NA>是pd.NA的表示,它与具体的数值类型(如整数、布尔)结合,形成可空类型。这意味着使用Int64Dtype时,列的实际类型是pandas.core.arrays.integer.Int64Dtype,而不是float64。
  • 其他可空Dtype:除了Int64Dtype,Pandas还提供了其他可空Dtype,例如BooleanDtype('boolean')用于可空布尔值,以及StringDtype('string')用于可空字符串。这些Dtype在处理各种包含缺失值的数据类型时都非常有用。
  • 性能考量:虽然可空Dtype提供了更精确的类型表示,但它们通常是基于NumPy数组的包装器,可能在某些操作上略慢于纯粹的NumPy Dtype(如int64或float64)。然而,它们通常比使用object Dtype来存储混合类型数据更高效,因为object Dtype需要存储Python对象的指针。
  • 数据操作:使用Int64Dtype的列在进行数学运算时,pd.NA会像NaN一样传播,即任何与pd.NA进行的运算结果通常仍为pd.NA。

5. 总结

通过利用Pandas 1.0及更高版本提供的pd.NA和可空Dtype(如Int64Dtype),开发者可以更精确地处理包含缺失值的数值数据。这种方法避免了不必要的类型强制转换,使得DataFrame列能够保持其固有的整数类型,同时优雅地表示缺失值。在需要严格控制数据类型或进行精确数值计算的场景中,采用dtype='Int64'是一个推荐的最佳实践。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注