Pandas 能识别哪些数据类型?
- 2025-03-19 08:56:00
- admin 原创
- 33
问题描述:
对于熊猫,有人知道除了
(i)float64
,int64
(以及np.number
类似float32
等的其他变体int8
)
(二) bool
(三datetime64
)timedelta64
例如字符串列,总是有dtype
一个object
?
或者,我想知道,上面列表中除了 (i)、(ii) 和 (iii) 之外是否还存在任何数据类型,pandas
不会使其dtype
成为object
?
解决方案 1:
pandas
借用了 的数据类型numpy
。有关此内容的演示,请参见以下内容:
import pandas as pd
df = pd.DataFrame({'A': [1,'C',2.]})
df['A'].dtype
>>> dtype('O')
type(df['A'].dtype)
>>> numpy.dtype
numpy.dtypes
您可以在文档中找到有效的列表:
‘?’ 布尔值
‘b’(有符号)字节
‘B’ 无符号字节
‘i’(有符号)整数
‘u’ 无符号整数
‘f’ 浮点数
‘c’ 复数浮点
'm' 时间增量
‘M’ 日期时间
‘O’ (Python) 对象
'S', 'a' 以零结尾的字节(不推荐)
‘U’ Unicode 字符串
‘V’ 原始数据(无效)
pandas
应该支持这些类型。使用具有上述任何选项的对象astype
的方法作为输入参数将导致尝试将转换为该类型(或至少回退到类型);这是我认为唯一完全不理解的:pandas.Series
`pandasSeries
object'u'
pandas`
df['A'].astype('u')
>>> TypeError: data type "u" not understood
出现此numpy
错误是因为后面'u'
需要跟一个数字来指定每个项目的字节数(该数字必须有效):
import numpy as np
np.dtype('u')
>>> TypeError: data type "u" not understood
np.dtype('u1')
>>> dtype('uint8')
np.dtype('u2')
>>> dtype('uint16')
np.dtype('u4')
>>> dtype('uint32')
np.dtype('u8')
>>> dtype('uint64')
# testing another invalid argument
np.dtype('u3')
>>> TypeError: data type "u3" not understood
总而言之,对象astype
的方法pandas
将尝试对任何有效的参数执行合理的操作numpy.dtype
。请注意,numpy.dtype('f')
与相同numpy.dtype('float32')
,numpy.dtype('f8')
与等相同。numpy.dtype('float64')
将参数传递给pandas
astype
方法也是如此。
为了在 NumPy 中找到相应的数据类型类,Pandas 文档建议这样做:
def subdtypes(dtype):
subs = dtype.__subclasses__()
if not subs:
return dtype
return [dtype, [subdtypes(dt) for dt in subs]]
subdtypes(np.generic)
输出:
[numpy.generic,
[[numpy.number,
[[numpy.integer,
[[numpy.signedinteger,
[numpy.int8,
numpy.int16,
numpy.int32,
numpy.int64,
numpy.int64,
numpy.timedelta64]],
[numpy.unsignedinteger,
[numpy.uint8,
numpy.uint16,
numpy.uint32,
numpy.uint64,
numpy.uint64]]]],
[numpy.inexact,
[[numpy.floating,
[numpy.float16, numpy.float32, numpy.float64, numpy.float128]],
[numpy.complexfloating,
[numpy.complex64, numpy.complex128, numpy.complex256]]]]]],
[numpy.flexible,
[[numpy.character, [numpy.bytes_, numpy.str_]],
[numpy.void, [numpy.record]]]],
numpy.bool_,
numpy.datetime64,
numpy.object_]]
Pandas 接受这些类作为有效类型。例如,dtype={'A': np.float}
。
NumPy 文档包含更多详细信息和图表:
解决方案 2:
编辑于 2020 年 2 月,紧随 pandas 1.0.0 发布之后
Pandas 主要使用 NumPy 数组和每个 Series 的 dtypes(数据框是 Series 的集合,每个 Series 可以有自己的 dtype)。NumPy 的文档进一步解释了dtype、数据类型和数据类型对象。此外,@lcameron05 提供的答案对 numpy dtypes 进行了出色的描述。此外,pandas 文档中有关dtypes 的说明还有很多其他信息。
pandas 对象中存储的主要类型是 float、int、bool、datetime64[ns]、timedelta[ns] 和 object。此外,这些数据类型还有项目大小,例如 int64 和 int32。
默认情况下,整数类型为 int64,浮点类型为 float64,无论平台是什么(32 位或 64 位)。以下内容都将产生 int64 dtypes。
但是,Numpy 在创建数组时会选择与平台相关的类型。以下将在 32 位平台上产生 int32。pandas 1.0.0 版的主要变化之一是引入了 来
pd.NA
表示标量缺失值(而不是以前的np.nan
、pd.NaT
或None
,具体取决于用途)。
Pandas 扩展了 NumPy 的类型系统,也允许用户编写自己的扩展类型。下面列出了所有 pandas 扩展类型。
1)时区处理
数据类型:tz 感知日期时间(请注意,NumPy 不支持时区感知日期时间)。
数据类型:DatetimeTZDtype
标量:时间戳
数组:arrays.DatetimeArray
字符串别名:'datetime64[ns, ]'
2)分类数据
数据类型:分类
数据类型:CategoricalDtype
标量:(无)
数组:分类
字符串别名:'category'
3)时间跨度表示
数据类型:期间(时间跨度)
数据类型:PeriodDtype
标量:周期
数组:arrays.PeriodArray
字符串别名:'period[]','Period[]'
4)稀疏数据结构
数据类型:稀疏
数据类型:SparseDtype
标量:(无)
数组:arrays.SparseArray
字符串别名:'Sparse'、'Sparse[int]'、'Sparse[float]'
5)间隔索引
数据类型:间隔
数据类型:IntervalDtype
标量:间隔
数组:arrays.IntervalArray
字符串别名:'interval'、'Interval'、'Interval[<numpy_dtype>]'、'Interval[datetime64[ns, ]]'、'Interval[timedelta64[]]'
6)可空整数数据类型
数据类型:可空整数
数据类型:Int64Dtype,...
标量:(无)
数组:arrays.IntegerArray
字符串别名:'Int8'、'Int16'、'Int32'、'Int64'、'UInt8'、'UInt16'、'UInt32'、'UInt64'
7)处理文本数据
数据类型:字符串
数据类型:StringDtype
标量:str
数组:arrays.StringArray
字符串别名:'string'
8)具有缺失值的布尔数据
数据类型:布尔值(含 NA)
数据类型:BooleanDtype
标量:bool
数组: arrays.BooleanArray
字符串别名:'boolean'
解决方案 3:
在其他答案的基础上,pandas 还包含了许多自己的数据类型。
Pandas 和第三方库在几个地方扩展了 NumPy 的类型系统。本节介绍 pandas 内部所做的扩展。请参阅扩展类型,了解如何编写与 pandas 配合使用的扩展。请参阅扩展数据类型,查看已实现扩展的第三方库列表。
下表列出了所有 pandas 扩展类型。请参阅相应的文档
https://pandas.pydata.org/pandas-docs/stable/user_guide/basics.html#basics-dtypes
--更新链接--
此外,从 pandas 1.0 开始,它有自己的字符串 dtype 和可空 dtype。