检查列数据类型
读取 dtypes 属性,区分 int64、float64 和 object,并找出需要转换的列。
检查列数据类型 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。
列数据类型为何重要
Pandas 的每一列都有一个数据类型,它决定值在内存中的存储方式,以及哪些操作对这些值有效。数据类型为 object(字符串)的整数列无法进行求和。以字符串形式存储的日期会被当作文本处理,而不是时间序列。错误的数据类型是数据分析管道中最常见的静默错误和意外结果来源之一。
加载新数据集后,请始终将检查数据类型作为第一步。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': ['25', '30', '35'], # looks like int, stored as object
'salary': [50000, 60000, 70000], # int64
'hired': ['2022-01-01', '2023-06-15', '2024-03-10'] # looks like date
})
print(df.dtypes)
# age object
# salary int64
# hired object
# dtype: object数据类型属性
DataFrame.dtypes 返回一个 Series,其索引是列名,值是每列的 Pandas 数据类型。您经常会遇到的数据类型包括 int64、float64、object(字符串和混合类型)、bool、datetime64[ns] 和 category。数据类型名称同时告诉您数据的种类以及每个值占用多少字节。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'int_col': [1, 2, 3],
'float_col': [1.5, 2.5, 3.5],
'str_col': ['a', 'b', 'c'],
'bool_col': [True, False, True]
})
print(df.dtypes)
# int_col int64
# float_col float64
# str_col object
# bool_col bool
# dtype: object识别 object 数据类型
object 数据类型是 Pandas 为无法以数值或布尔类型存储的列提供的通用类型。它通常表示字符串数据,但也可能表示混合类型列(例如整数和字符串混合)。与专用数据类型相比,object 列占用更多内存,操作速度也更慢。看到 object 时,请问自己:这一列应该是字符串、数字、类别,还是日期?
import pandas as pd
df = pd.DataFrame({'mixed': [1, 'two', 3.0, None]})
print(df.dtypes)
# mixed object
# Check actual Python types inside the column
print(df['mixed'].apply(type).value_counts())
# <class 'int'> 1
# <class 'str'> 1
# <class 'float'> 2 (includes NaN which is float)使用 info() 全面查看数据类型
df.info() 会打印一个简明表格,显示每列的名称、非空值数量和数据类型,以及总内存使用量。这个命令可以完整概览数据集的质量:您可以同时看到哪些列存在缺失数据以及哪些列的数据类型错误,因此它是加载数据集后的标准第一条命令。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'id': [1, 2, 3],
'score': [88.5, 92.0, np.nan],
'grade': ['A', 'A', 'B']
})
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# --- ------ -------------- -----
# 0 id 3 non-null int64
# 1 score 2 non-null float64
# 2 grade 3 non-null object
# dtypes: float64(1), int64(1), object(1)
# memory usage: 200.0+ bytesread_csv 后常见的数据类型问题
Pandas 读取 CSV 文件时,会通过扫描值来推断数据类型。由此会产生几个常见问题:如果存在千位逗号分隔符或货币符号,数值列会被读取为 object;如果布尔值以“是”/“否”字符串存储,布尔列会被读取为 object;由于 Pandas 除非得到明确指示,否则不会解析日期,日期列会被读取为 object。识别这些模式后,您就能通过类型转换快速修复它们。
import pandas as pd
import io
csv = '''price,date,is_active
'1,200',2024-01-15,Yes
'800',2024-02-20,No
'''
df = pd.read_csv(io.StringIO(csv))
print(df.dtypes)
# price object <- should be int
# date object <- should be datetime64
# is_active object <- should be bool不同数据类型的内存使用量
不同的数据类型会占用差异极大的内存。一个 int64 列每个值占用 8 个字节,而存储短字符串的 object 列每个值可能占用 50–200 个字节。对于包含数百万行的 DataFrame,选择正确的数据类型可以将内存占用从 GB 降低到 MB。调用 df.memory_usage(deep=True) 可查看每列的字节开销。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'int64_col': np.arange(1_000_000, dtype='int64'),
'float32_col': np.arange(1_000_000, dtype='float32'),
'obj_col': ['a'] * 1_000_000
})
mem = df.memory_usage(deep=True) / 1024**2 # MB
print(mem.round(2))
# Index 0.00
# int64_col 7.63
# float32_col 3.81
# obj_col 55.26 <- much more for object!发现数据类型错误的数值列
一个常见问题是数值列因混入多余的格式字符而被存储为 object。您可以检查 pd.to_numeric(df['col'], errors='coerce') 的结果是否与原列不同,从而发现这一问题。无法解析的值会变为 NaN,准确显示出哪些行导致类型推断失败。
import pandas as pd
df = pd.DataFrame({'revenue': ['1000', '2000', '$3000', '4,000']})
# Check which values can't be parsed as numbers
parsed = pd.to_numeric(df['revenue'], errors='coerce')
print(parsed)
# 0 1000.0
# 1 2000.0
# 2 NaN <- '$3000' failed
# 3 NaN <- '4,000' failed检查整数与浮点数的歧义
当一列包含任何 NaN 值时,Pandas 会将整数列存储为 float64,因为标准 NumPy 整数类型无法表示 NaN。这样得到的 25.0 等浮点数看起来像整数,但实际以浮点数存储。Pandas 引入了可空整数类型(大写 I 的 Int64),它既支持 NaN,又保持整数语义。
import pandas as pd
import numpy as np
df = pd.DataFrame({'count': [1, 2, np.nan, 4]})
print(df['count'].dtype) # float64 — because NaN is float
# Nullable integer type supports NaN
df['count'] = df['count'].astype('Int64') # capital I!
print(df)
# count
# 0 1
# 1 2
# 2 <NA>
# 3 4
print(df['count'].dtype) # Int64使用 select_dtypes() 按类型筛选
df.select_dtypes(include=) 允许您选择属于某个特定类型系列的所有列。常用参数包括:'number'(所有数值类型)、'object'(字符串)、'bool'、'datetime' 和 'category'。在管道开始处使用它非常有用:您可以只对数值列执行数值清理,只对文本列执行字符串清理。
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'age': [25, 30],
'salary': [50000.0, 70000.0],
'dept': ['Eng', 'HR']
})
numeric = df.select_dtypes(include='number')
print('Numeric columns:', numeric.columns.tolist())
# ['age', 'salary']
text = df.select_dtypes(include='object')
print('Text columns:', text.columns.tolist())
# ['name', 'dept']构建数据类型报告
在探索性数据分析(EDA)中,一个实用的习惯是构建数据类型报告,列出每列的数据类型、唯一值数量和示例值。这样可以在分析开始前快速找出需要转换的列。您可以通过根据各列聚合结果构建一个简单的 DataFrame 来生成此类报告。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': [25, 30, 35],
'salary': [50000, 60000, 70000],
'dept': ['Eng', 'HR', 'Eng'],
'hired': ['2022-01-01', '2023-06-15', '2024-03-10']
})
report = pd.DataFrame({
'dtype': df.dtypes,
'unique_count': df.nunique(),
'sample': df.iloc[0]
})
print(report)生产管道中的数据类型一致性
在每天处理新数据的生产管道中,数据类型可能会发生漂移——如果出现一个 NaN,原本始终为 int64 的列可能会变成 float64。请在管道开始处添加数据类型断言,及早捕获模式变化。明确报错并停止执行,远胜于静默地产生错误结果并将问题传递到后续步骤。
import pandas as pd
df = pd.DataFrame({'user_id': [1, 2, 3], 'score': [88.0, 92.0, 76.0]})
expected_dtypes = {'user_id': 'int64', 'score': 'float64'}
for col, expected in expected_dtypes.items():
actual = str(df[col].dtype)
assert actual == expected, (
f'Column {col}: expected {expected}, got {actual}'
)
print('All dtypes are correct')快速检查
测试您对检查列数据类型的理解。
课程回顾
本课中您学到了:df.dtypes 显示每列的类型,object 数据类型是字符串和混合类型的通用类型,而 df.info() 提供完整的类型和可空性概览。使用 select_dtypes() 按类型系列筛选列,并添加数据类型断言来检测生产环境中的模式漂移。接下来,我们将使用 astype() 将列转换为正确的数据类型。
常见问题解答
「检查列数据类型」课时是免费的吗?
是的 — 「检查列数据类型」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。
「检查列数据类型」这节课中我会学到什么?
读取 dtypes 属性,区分 int64、float64 和 object,并找出需要转换的列。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Pandas & NumPy Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「检查列数据类型」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?
能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 检查列数据类型
- 使用 astype() 转换类型
- 分类数据类型
- 正确解析日期