3.2 数据类型转换 Pandas 数据清洗与预处理:3.2 数据类型转换详解 3.2.1 为什么需要数据类型转换? 以下是一些需要进行数据类型转换的常见原因: 数据导入错误: 从文件(如CSV、Excel)或数据库导入数据时,Pandas可能会自动推断数据类型,但这种推断可能不准确。例如,数字列可能被错误地识别为字符串。 数据格式不一致: 不同的数据源可能使用不同的格式表示相同的信息。例如,日期可能以不同的字符串格式存储。 内存优化: 某些数据类型比其他数据类型占用更多的内存。将数据转换为更有效的类型可以显著减少内存使用。 计算需求: 某些操作需要特定类型的数据。例如,数学运算只能在数值类型上执行。 数据验证: 确保数据符合预期的数据类型是数据验证的重要组成部分。 3.2.
3.2.1 为什么需要数据类型转换?
以下是一些需要进行数据类型转换的常见原因:
数据导入错误: 从文件(如CSV、Excel)或数据库导入数据时,Pandas可能会自动推断数据类型,但这种推断可能不准确。例如,数字列可能被错误地识别为字符串。
数据格式不一致: 不同的数据源可能使用不同的格式表示相同的信息。例如,日期可能以不同的字符串格式存储。
内存优化: 某些数据类型比其他数据类型占用更多的内存。将数据转换为更有效的类型可以显著减少内存使用。
计算需求: 某些操作需要特定类型的数据。例如,数学运算只能在数值类型上执行。
数据验证: 确保数据符合预期的数据类型是数据验证的重要组成部分。
3.2.2 Pandas 中的常见数据类型
在深入了解数据类型转换之前,让我们回顾一下Pandas中常见的几种数据类型:
object: 通常表示字符串或混合类型的数据。
int64: 整数类型(64位)。
float64: 浮点数类型(64位)。
bool: 布尔类型(True/False)。
datetime64[ns]: 日期和时间类型。
timedelta64[ns]: 时间差类型。
category: 分类类型,用于表示有限数量的重复值。
可以使用 df.dtypes 属性查看DataFrame中每一列的数据类型。
import pandas as pd data = {'col1': [1, 2, 3], 'col2': ['4', '5', '6'], 'col3': [True, False, True]} df = pd.DataFrame(data) print(df.dtypes)
输出:
col1 int64 col2 object col3 object dtype: object
3.2.3 数据类型转换方法
Pandas 提供了多种方法来转换数据类型,最常用的方法包括:
astype(): 这是最常用的数据类型转换方法,可以灵活地将列转换为各种数据类型。
pd.to_numeric(): 专门用于将列转换为数值类型(整数或浮点数)。
pd.to_datetime(): 专门用于将列转换为日期时间类型。
pd.to_timedelta(): 专门用于将列转换为时间差类型。
pd.Categorical(): 用于创建分类数据类型。
3.2.3.1 astype() 方法
astype() 方法允许您将 Series 或 DataFrame 的列转换为指定的数据类型。
import pandas as pd data = {'col1': [1, 2, 3], 'col2': ['4', '5', '6'], 'col3': [True, False, True]} df = pd.DataFrame(data) # 将 col2 转换为 int64 df['col2'] = df['col2'].astype('int64') print(df.dtypes) print(df['col2']) # 将 col1 转换为 float64 df['col1'] = df['col1'].astype('float64') print(df.dtypes) # 将 col3 转换为 bool df['col3'] = df['col3'].astype('bool') print(df.dtypes) print(df['col3'])
输出:
col1 int64 col2 int64 col3 object dtype: object 0 4 1 5 2 6 Name: col2, dtype: int64 col1 float64 col2 int64 col3 object dtype: object col1 float64 col2 int64 col3 bool dtype: object 0 True 1 False 2 True Name: col3, dtype: bool
处理错误:
如果 astype() 遇到无法转换的值,它将引发错误。 可以使用 errors 参数来控制错误处理:
errors='raise' (默认): 如果转换失败,则引发异常。
errors='ignore' : 忽略转换错误,保持原始数据类型。
import pandas as pd data = {'col1': ['1', '2', 'a']} df = pd.DataFrame(data) try: df['col1'] = df['col1'].astype('int64') except ValueError as e: print(f"Error: {e}") df['col1'] = df['col1'].astype('int64', errors='ignore') print(df['col1'])
输出:
Error: invalid literal for int() with base 10: 'a' 0 1 1 2 2 a Name: col1, dtype: object
3.2.3.2 pd.to_numeric() 方法
pd.to_numeric() 专门用于将列转换为数值类型。 它比 astype() 更灵活,因为它能够处理一些 astype() 无法处理的情况,例如包含非数字字符的字符串。
import pandas as pd data = {'col1': ['1', '2.5', '3', 'a']} df = pd.DataFrame(data) # 将 col1 转换为数值类型 df['col1'] = pd.to_numeric(df['col1'], errors='coerce') print(df.dtypes) print(df['col1'])
输出:
col1 float64 dtype: object 0 1.0 1 2.5 2 3.0 3 NaN Name: col1, dtype: float64
errors 参数:
pd.to_numeric() 也使用 errors 参数来处理转换错误:
errors='raise' (默认): 如果转换失败,则引发异常。
errors='coerce' : 将无法转换的值替换为 NaN。
errors='ignore' : 忽略转换错误,保持原始数据类型。
downcast 参数:
downcast 参数允许您将数值类型转换为更小的类型以节省内存。 例如,可以将 float64 转换为 float32 或将 int64 转换为 int32。
import pandas as pd data = {'col1': [1, 2, 3]} df = pd.DataFrame(data) df['col1'] = pd.to_numeric(df['col1'], downcast='integer') print(df.dtypes) df['col1'] = pd.to_numeric(df['col1'], downcast='float') print(df.dtypes)
输出:
col1 int8 dtype: object col1 float32 dtype: object
3.2.3.3 pd.to_datetime() 方法
pd.to_datetime() 用于将列转换为日期时间类型。 它可以处理各种日期和时间格式。
import pandas as pd data = {'date': ['2023-10-26', '10/27/2023', 'Oct 28, 2023']} df = pd.DataFrame(data) # 将 date 列转换为 datetime64[ns] 类型 df['date'] = pd.to_datetime(df['date']) print(df.dtypes) print(df['date'])
输出:
date datetime64[ns] dtype: object 0 2023-10-26 1 2023-10-27 2 2023-10-28 Name: date, dtype: datetime64[ns]
format 参数:
如果日期格式不标准,可以使用 format 参数指定日期格式。 format 参数使用与 Python datetime 模块相同的格式代码。
import pandas as pd data = {'date': ['26-10-2023', '27-10-2023']} df = pd.DataFrame(data) # 指定日期格式为 DD-MM-YYYY df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y') print(df['date'])
输出:
0 2023-10-26 1 2023-10-27 Name: date, dtype: datetime64[ns]
errors 参数:
pd.to_datetime() 也使用 errors 参数来处理转换错误,与 pd.to_numeric() 类似。
3.2.3.4 pd.to_timedelta() 方法
pd.to_timedelta() 用于将列转换为时间差类型。时间差表示两个日期或时间之间的差异。
import pandas as pd data = {'time_diff': ['1 days', '2 hours', '30 minutes']} df = pd.DataFrame(data) # 将 time_diff 列转换为 timedelta64[ns] 类型 df['time_diff'] = pd.to_timedelta(df['time_diff']) print(df.dtypes) print(df['time_diff'])
输出:
time_diff timedelta64[ns] dtype: object 0 1 days 1 0 days 02:00:00 2 0 days 00:30:00 Name: time_diff, dtype: timedelta64[ns]
3.2.3.5 pd.Categorical() 方法
pd.Categorical() 用于创建分类数据类型。 分类数据类型适用于表示有限数量的重复值,例如性别、国家或产品类别。 使用分类数据类型可以节省内存并提高性能。
import pandas as pd data = {'gender': ['Male', 'Female', 'Male', 'Male', 'Female']} df = pd.DataFrame(data) # 将 gender 列转换为 category 类型 df['gender'] = pd.Categorical(df['gender']) print(df.dtypes) print(df['gender'])
输出:
gender category dtype: object 0 Male 1 Female 2 Male 3 Male 4 Female Name: gender, dtype: category Categories (2, object): ['Female', 'Male']
3.2.4 数据类型转换流程图
3.2.5 最佳实践
了解数据: 在转换数据类型之前,务必了解数据的含义和格式。
谨慎处理错误: 使用 errors 参数来处理转换错误,避免程序崩溃。
选择合适的类型: 选择最适合数据的类型,以节省内存并提高性能。
验证结果: 转换数据类型后,验证结果是否正确。
文档化: 在代码中记录数据类型转换的原因和方法。
3.2.6 总结
数据类型转换是数据清洗和预处理的关键步骤。Pandas 提供了多种方法来转换数据类型,每种方法都有其优缺点。选择合适的方法并正确处理错误是确保数据质量的重要因素。 通过理解数据类型转换的原理和实践,您可以更好地处理和分析数据。