本文目录导读:

- 使用
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中常用的数据类型转换方法,根据具体需求选择合适的方式即可。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播