3. 数据类型转换

方法/操作语法示例描述
查看数据类型df.dtypes显示每列的数据类型
强制类型转换df[‘col’].astype(‘int’)将列转换为指定类型(如int, float, str, datetime)
转换为日期时间pd.to_datetime(df[‘col’])将字符串列转为datetime类型
转换为分类数据df[‘col’].astype(‘category’)将列转为分类类型(节省内存,提高性能)
数值格式化df[‘col’].round(2)保留2位小数

核心方法

操作方法/函数描述
查看数据类型df.dtypes显示每列的数据类型(如int64、float64、object等)。
强制类型转换df[‘col’].astype(‘type’)将列转换为指定类型(如int、float、str、bool等)。
转换为日期时间pd.to_datetime(df[‘col’])将字符串或数值列转为datetime类型(支持自定义格式)。
转换为分类数据df[‘col’].astype(‘category’)将列转为分类类型(节省内存,提高性能,适用于有限取值的列如性别、省份)。
数值格式化df[‘col’].round(2)保留指定小数位数(如2位)。

代码案例讲解

1. 查看数据类型

import pandas as pd

# 加载数据(以sleep.csv为例)
df = pd.read_csv("sleep.csv")
print(df.dtypes)

输出示例:

Plain Text
person_id                     int64
gender                       object
age                           int64
occupation                   object
sleep_duration              float64
sleep_quality               float64
…                          …

说明:object通常为字符串或混合类型,需检查是否需要转换。

2. 强制类型转换

将数值列转换为整数或字符串:

# 将sleep_duration从float转为int(丢失小数部分)
df['sleep_duration_int'] = df['sleep_duration'].astype('int32')

# 将gender转为字符串
df['gender_str'] = df['gender'].astype('str')

print(df[['sleep_duration', 'sleep_duration_int', 'gender_str']].head())

输出:

Plain Text
   sleep_duration  sleep_duration_int gender_str
0             7.4                  7       Male
1             4.2                  4     Female
2             6.1                  6       Male

3. 转换为日期时间

处理时间数据(假设employees.csv有日期列):

# 示例:创建临时日期列(实际数据可能为hire_date)
df_employees = pd.read_csv("employees.csv")
df_employees['fake_date'] = '2023-01-' + df_employees['employee_id'].astype(str).str[:2]

# 转换为datetime
df_employees['fake_date'] = pd.to_datetime(df_employees['fake_date'])
print(df_employees[['employee_id', 'fake_date']].head())

输出:

Plain Text
   employee_id  fake_date
0          100 2023-01-10
1          101 2023-01-10
2          102 2023-01-10

注意:若原始格式非标准,需指定格式参数,如:  

pd.to_datetime(df[‘date’], format=’%Y/%m/%d’)

4. 转换为分类数据

优化内存和性能(适用于低基数列):

# 将gender列转为分类类型
df['gender'] = df['gender'].astype('category')
print(df['gender'].dtypes)

输出:

Plain Text
category
优势:  减少内存占用(尤其对重复值多的列)。  加速groupby、sort等操作。

5. 数值格式化

控制小数位数:

# 保留sleep_quality的2位小数
df['sleep_quality_rounded'] = df['sleep_quality'].round(2)
print(df[['sleep_quality', 'sleep_quality_rounded']].head())

输出:

Plain Text
   sleep_quality  sleep_quality_rounded
0            7.0                   7.00
1            4.9                   4.90
2            6.0                   6.00

常见问题与技巧

处理转换错误:使用errors=’coerce’将无效值转为NaN,避免报错:

df['age'] = pd.to_numeric(df['age'], errors='coerce')

内存优化:将数值列从int64转为int32或float32:

df['age'] = df['age'].astype('int32')

布尔类型转换:将字符串(如”Yes”/”No”)转为布尔值:

df['is_active'] = df['active_flag'].map({'Yes': True, 'No': False})

自定义格式化:使用apply实现复杂转换(如百分比):

df['score_percent'] = df['score'].apply(lambda x: f"{x*100:.1f}%")

实战案例:处理penguins.csv

df_penguins = pd.read_csv("penguins.csv")

# 1. 转换sex为分类类型
df_penguins['sex'] = df_penguins['sex'].astype('category')

# 2. 补全缺失值后转换bill_length_mm为float32
df_penguins['bill_length_mm'] = df_penguins['bill_length_mm'].fillna(0).astype('float32')

# 3. 检查并输出结果
print(df_penguins[['species', 'sex', 'bill_length_mm']].dtypes)

输出:

Plain Text
species           object
sex             category
bill_length_mm    float32
© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容