本文目录导读:

- 使用
astype()方法 - 使用
pd.to_numeric()处理数值转换 - 使用
pd.to_datetime()处理日期转换 - 使用
pd.to_timedelta()转换为时间差 - 使用
convert_dtypes()自动推断最佳类型 - 批量转换多列
- 实际应用案例
- 注意事项
我来详细介绍Pandas中数据类型转换的几种常用方法:
使用 astype() 方法
最常用的转换方法,可以将列转换为指定类型。
import pandas as pd
import numpy as np
# 创建示例数据
df = pd.DataFrame({
'id': ['1', '2', '3', '4'],
'price': ['100.5', '200.3', '300.8', '400.1'],
'quantity': [10, 20, 30, 40],
'date': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04']
})
print("原始数据类型:")
print(df.dtypes)
print()
# 转换为整数
df['id'] = df['id'].astype(int)
# 转换为浮点数
df['price'] = df['price'].astype(float)
# 转换为字符串
df['quantity'] = df['quantity'].astype(str)
# 转换为 datetime
df['date'] = pd.to_datetime(df['date'])
print("转换后数据类型:")
print(df.dtypes)
使用 pd.to_numeric() 处理数值转换
专门用于转换为数值类型,可以处理错误值。
# 创建包含错误值的数据
df2 = pd.DataFrame({
'value': ['100', '200', 'error', '300', '400abc']
})
print("原始数据:")
print(df2)
# 方式1:强制转换为数值,错误值变为NaN
df2['value_coerce'] = pd.to_numeric(df2['value'], errors='coerce')
# 方式2:遇到错误时抛出异常
# df2['value_raise'] = pd.to_numeric(df2['value'], errors='raise')
# 方式3:忽略错误,不转换
df2['value_ignore'] = pd.to_numeric(df2['value'], errors='ignore')
print("\n转换结果:")
print(df2)
print("\n数据类型:")
print(df2.dtypes)
使用 pd.to_datetime() 处理日期转换
# 多种日期格式转换
dates_data = pd.DataFrame({
'date1': ['2024-01-01', '2024-02-15', '2024-03-20'],
'date2': ['01/01/2024', '02/15/2024', '03/20/2024'],
'date3': ['2024年1月1日', '2024年2月15日', '2024年3月20日'],
'timestamp': [1704067200, 1707955200, 1710892800] # 时间戳
})
# 转换标准日期格式
dates_data['date1'] = pd.to_datetime(dates_data['date1'])
# 转换非标准日期格式
dates_data['date2'] = pd.to_datetime(dates_data['date2'], format='%m/%d/%Y')
# 转换中文日期格式(需要指定格式)
dates_data['date3'] = pd.to_datetime(dates_data['date3'], format='%Y年%m月%d日')
# 时间戳转换为日期
dates_data['timestamp'] = pd.to_datetime(dates_data['timestamp'], unit='s')
print("日期转换结果:")
print(dates_data)
print("\n数据类型:")
print(dates_data.dtypes)
使用 pd.to_timedelta() 转换为时间差
# 时间差转换
time_data = pd.DataFrame({
'duration': ['1 day', '2 hours', '30 minutes', '1 hour 30 minutes']
})
# 转换时间差
time_data['duration_td'] = pd.to_timedelta(time_data['duration'])
# 计算总秒数
time_data['total_seconds'] = time_data['duration_td'].dt.total_seconds()
print("时间差转换结果:")
print(time_data)
使用 convert_dtypes() 自动推断最佳类型
# 创建混合类型数据
df3 = pd.DataFrame({
'col1': [1, 2, 3], # 整数
'col2': [1.5, 2.5, 3.5], # 浮点数
'col3': ['a', 'b', 'c'], # 字符串
'col4': [True, False, True], # 布尔值
'col5': [1, None, 3], # 包含空值
})
print("原始数据类型:")
print(df3.dtypes)
# 自动转换最佳类型
df3_converted = df3.convert_dtypes()
print("\n转换后数据类型:")
print(df3_converted.dtypes)
批量转换多列
# 批量转换指定列
df4 = pd.DataFrame({
'col1': ['1', '2', '3'],
'col2': ['4', '5', '6'],
'col3': ['7.5', '8.5', '9.5'],
'col4': ['文本1', '文本2', '文本3']
})
# 使用字典指定转换规则
convert_dict = {
'col1': int,
'col2': float,
'col3': float
}
df4 = df4.astype(convert_dict)
print("批量转换结果:")
print(df4.dtypes)
实际应用案例
# 读取CSV数据并处理类型转换
# 模拟读取的数据
data = {
'客户ID': ['C001', 'C002', 'C003', 'C004'],
'年龄': ['25', '30', '错误', '35'],
'收入': ['5000.50', '8000.00', '12000.00', '无效'],
'注册日期': ['2024/01/01', '2024/02/15', '2024-03-20', '2024/04/01'],
'是否VIP': ['是', '否', '是', '否'],
'订单数': [5, 8, 12, '3'],
}
df = pd.DataFrame(data)
print("原始数据类型:")
print(df.dtypes)
print("\n原始数据:")
print(df)
# 数据清洗和类型转换
# 1. 转换年龄为数值,错误值变为NaN
df['年龄'] = pd.to_numeric(df['年龄'], errors='coerce')
# 2. 转换收入为数值,错误值变为NaN
df['收入'] = pd.to_numeric(df['收入'], errors='coerce')
# 3. 转换订单数为整数
df['订单数'] = pd.to_numeric(df['订单数'], errors='coerce').astype('Int64')
# 4. 转换注册日期为标准日期格式
df['注册日期'] = pd.to_datetime(df['注册日期'], errors='coerce')
# 5. 转换年龄为整数
df['年龄'] = df['年龄'].astype('Int64')
# 6. 布尔值转换
df['是否VIP'] = df['是否VIP'].map({'是': True, '否': False})
print("\n处理后数据类型:")
print(df.dtypes)
print("\n处理后的数据:")
print(df)
注意事项
- 错误处理:使用
errors='coerce'参数可以避免因无效数据导致的转换失败 - 内存优化:使用
pd.Categorical()转换分类变量可以节省内存 - 精度问题:转换浮点数时注意精度损失
- 空值处理:
astype('Int64')可以保留 NaN 值
# 示例:分类变量和内存优化
df_optimized = df.copy()
df_optimized['是否VIP'] = df_optimized['是否VIP'].astype('category')
print("\n优化后内存使用:")
print(df_optimized.memory_usage(deep=True))
这些是Pandas中常用的数据类型转换方法,根据具体需求选择合适的方式即可。