当将包含整数和`none`值的数组加载到pandas dataframe列时,由于`none`被转换为浮点类型的`nan`,整数值通常会自动变为浮点数。本教程将深入探讨这一常见问题,并提供使用pandas 1.0.0及更高版本引入的`int64dtype`和`pd.na`来解决此问题的专业方法,确保在保留整数类型的同时,能够清晰地表示缺失值。
理解问题:为何整数会变为浮点数?
在Pandas中,当一个Series或DataFrame列包含不同类型的数据时,Pandas会尝试寻找一个能够容纳所有值的通用数据类型。对于包含整数和None(或NaN)的列,默认情况下,Pandas会将None视为缺失值,并将其内部表示为浮点类型的NaN(Not a number)。由于浮点类型可以表示整数,并且能够容纳NaN,因此整个列的数据类型会被强制转换为浮点型(例如float64),从而导致原始的整数值也带上小数点(如101变为101.0)。
考虑以下示例代码:
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
可以看到,所有整数都变成了浮点数,且列的数据类型为float64。这在某些场景下可能不是期望的行为,特别是在需要严格保持整数类型进行后续计算或数据存储时。
立即进入“豆包AI人工智官网入口”;
立即学习“豆包AI人工智能在线问答入口”;
解决方案:使用可空整数类型 Int64Dtype 和 pd.NA
从Pandas 1.0.0版本开始,引入了pd.NA作为一种通用的缺失值指示符,以及一系列可空(Nullable)数据类型,如pd.Int64Dtype,旨在解决在存在缺失值时类型转换的问题。pd.Int64Dtype(通常简写为字符串”Int64″,注意大写I)允许一个整型列包含缺失值,而不会将其强制转换为浮点型。这些缺失值将以pd.NA的形式表示。
要实现所需的行为,即保留整数类型并用适当的缺失值表示None,可以在创建DataFrame时指定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", # 使用字符串别名 pd.Int64Dtype() ) 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>,而所有的整数值都成功地保持了其整数形式,并且列的数据类型也正确地显示为Int64。
关键概念与注意事项
pd.NA:新的缺失值表示pd.NA是Pandas中一个实验性的、通用的缺失值标量,旨在提供一个比np.nan和None更一致且类型感知的缺失值表示。它与Nullable Dtypes(如Int64Dtype、BooleanDtype、StringDtype等)协同工作。
Int64Dtype:可空整数类型 这是Pandas提供的一种扩展数据类型,它允许int64整数类型与pd.NA缺失值共存。除了Int64Dtype,Pandas还提供了Int8Dtype、Int16Dtype、Int32Dtype等,以及对应的无符号整数类型(如UInt64Dtype)。选择哪种类型取决于你的数据范围。
版本要求 此功能要求Pandas版本在1.0.0或更高。如果使用旧版本Pandas,可能需要升级或寻找其他兼容方案(例如,在加载后手动转换类型,但这可能不如直接指定dtype高效和优雅)。
与其他缺失值的区别
性能考量 使用Int64Dtype等可空类型可能会比传统的NumPy数组支持的固定类型(如int64或float64)占用更多内存,因为它们通常是基于Pandas内部的ExtensionArray实现。然而,它提供了更精确的类型语义和更方便的缺失值处理。
总结
通过利用Pandas 1.0.0及更高版本提供的Int64Dtype和pd.NA,开发者可以有效地解决将包含None值的数组加载到DataFrame时整数自动转换为浮点数的问题。这种方法不仅能保持数据的原始整数类型,还能以清晰且类型安全的方式表示缺失值,从而提高了数据处理的准确性和代码的可读性。在处理混合类型数据,尤其是包含缺失值的整型数据时,推荐优先考虑使用这些可空数据类型。