类型工具帮助判断、转换和识别 pandas 中的各类数据类型,以及处理缺失值的表示方式。
1. pd.api.types
pd.api.types 是 pandas 提供的类型判断模块,内含大量工具函数。
1.1 常用判断函数
| 函数 | 作用 |
|---|---|
is_integer_dtype(obj) | 是否为整数类型(含可空整数) |
is_float_dtype(obj) | 是否为浮点类型(含可空浮点) |
is_bool_dtype(obj) | 是否为布尔类型(含可空布尔) |
is_object_dtype(obj) | 是否为 object 类型 |
is_string_dtype(obj) | 是否为字符串类型(含 string 与 object 推断) |
is_datetime64_any_dtype(obj) | 是否为任何类型的 datetime64(含时区) |
is_timedelta64_dtype(obj) | 是否为 timedelta64 类型 |
is_categorical_dtype(obj) | 是否为 category 类型 |
is_sparse(obj) | 是否为 SparseDtype |
is_numeric_dtype(obj) | 是否为数值类型(整数、浮点、复数) |
is_extension_array_dtype(obj) | 是否为扩展数组类型(如 Int64、ArrowDtype) |
is_interval_dtype(obj) | 是否为区间类型 |
is_period_dtype(obj) | 是否为周期类型 |
import pandas as pd
import numpy as np
s = pd.Series([1, 2, 3], dtype='Int64')
pd.api.types.is_integer_dtype(s) # True
pd.api.types.is_extension_array_dtype(s) # True
pd.api.types.is_numeric_dtype(s) # True1.2 其他重要工具
| 函数 | 作用 |
|---|---|
infer_dtype(obj, skipna=True) | 推断标量或数组的实际数据类型(字符串描述) |
pandas_dtype(dtype) | 将 dtype 字符串或对象解析为 pandas dtype |
union_categoricals(cats) | 合并多个 Categorical 对象,保留所有类别 |
pd.api.types.infer_dtype([1, 2, 3]) # 'integer'
pd.api.types.pandas_dtype('Int64') # Int64Dtype()
c1 = pd.Categorical(['a', 'b'])
c2 = pd.Categorical(['b', 'c'])
merged = pd.api.types.union_categoricals([c1, c2])
print(merged.categories) # Index(['a', 'b', 'c'])2. 转换函数
2.1 Pandas 内置转换方法
| 方法 | 作用 |
|---|---|
astype(dtype) | 强制转换为指定类型 |
convert_dtypes() | 自动推断每列为最佳可空类型(如 Int64、string、boolean) |
infer_objects() | 尝试将 object 类型推断为更具体的类型 |
df = pd.DataFrame({
'a': [1, 2, None], # 整型混合缺失
'b': ['x', 'y', 'z'], # 字符串
'c': [True, False, None] # 布尔混合缺失
})
print(df.dtypes)
# a float64
# b object
# c object
# dtype: object
df2 = df.convert_dtypes()
print(df2.dtypes)
# a Int64
# b string
# c boolean
# dtype: object2.2 顶级转换函数
| 函数 | 作用 |
|---|---|
pd.to_numeric(arg) | 转为数值类型,可处理错误选项 |
pd.to_datetime(arg) | 转为 datetime64 序列或索引 |
pd.to_timedelta(arg) | 转为 timedelta64 序列或索引 |
# to_numeric
pd.to_numeric(['1', '2.5', None]) # 自动处理 None -> NaN
# to_datetime
pd.to_datetime(['2024-01-01', '2024-01-02'])
# to_timedelta
pd.to_timedelta(['1 day', '2 hours'])参数示例
to_numeric(..., errors='coerce'):无效值转为NaNto_datetime(..., format='%Y-%m-%d'):指定解析格式to_timedelta(..., unit='h'):指定数值单位
3. 缺失值标识
pandas 用多种方式表示缺失数据,需根据上下文选择。
3.1 缺失值类型
| 标识 | 类型 | 说明 |
|---|---|---|
pd.NA | pandas 通用缺失值 | 用于可空类型(Int64、string、boolean) |
pd.NaT | 时间戳缺失值 | 用于 datetime64、timedelta64、period |
np.nan | NumPy 浮点缺失值 | 浮动数类型的默认缺失值 |
None | Python 对象 | 存入 object 类型时显示为 None |
兼容性提醒
np.nan属于 float,在整数列中会被强制转为浮点。pd.NA在sum()、mean()等聚合中遵循“跳过缺失”规则。pd.NaT与np.nan在比较时不相等。
3.2 缺失值判断函数
| 函数 | 作用 |
|---|---|
pd.isna(obj) | 判断元素是否为 NaN、NaT、NA、None |
pd.notna(obj) | isna 的反操作 |
s = pd.Series([1, pd.NA, np.nan, None], dtype='Int64')
pd.isna(s) # [False, True, True, True]
pd.notna(s) # [True, False, False, False]注意
- 建议统一使用
pd.isna()/pd.notna()处理所有缺失类型。- 判断单个值是否为缺失,可直接
pd.isna(value)。