因为不同的分析方法需要特定的数据类型,数据类型转换是处理和清洗数据的常见操作。课程中通常采用 astype() 方法,可以将序列、数据框的指定列或者整个数据框对象转换为指定的数据类型。本节属于 4.6 数据清洗和预处理,与缺失值、异常值、重复值处理一起,保证进入后续分析的数据不仅完整,而且类型正确。
课程示例先用整数二维数组构造数据框,行标签为一月至四月,列标签为美好集团、北方通信、广东科技:
import numpy as np
from pandas import DataFrame
a = np.array([[163, 113, 132],
[175, 129, 119],
[193, 127, 125],
[189, 126, 110]])
df = DataFrame(a, index=['一月', '二月', '三月', '四月'],
columns=['美好集团', '北方通信', '广东科技'])
此时各列一般为整数类型(如 int64)。将数据框的所有列都转换成目标类型时,直接对数据框调用:df.astype('float32')。返回的新数据框中,各列显示为 163.0、113.0、132.0 等形式,dtype 均为 float32。该调用只返回新对象,原数据框若未接收返回值,类型保持不变。
只转换一列时,对取出的序列调用 astype(),生成一个新的序列对象。例如 df['北方通信'].astype('float32'),结果索引仍为一月至四月,值分别为 113.0、129.0、127.0、126.0,Name 为北方通信,dtype 为 float32。该语句不会改写原数据框中的「北方通信」列。要将新生成的对象写入原始对象,必须赋值:df['北方通信'] = df['北方通信'].astype('float32')。赋值后只有该列变为 float32,美好集团、广东科技仍为原来的整数类型。
易错点:astype() 默认返回新对象,不原地修改;只写 df.astype('float32') 或 df['北方通信'].astype('float32') 而不赋值,原数据框类型不变。整表转换与单列转换范围不同:前者所有列一起变,后者只影响被选中的那一列。目标类型按课程写成字符串,如 'float32'。不要把本节的 astype() 与缺失值的 fillna()、重复值的 drop_duplicates() 混用;日期字符串转为时间类型属于 4.7.1 的 pd.to_datetime(),不是本节内容。
astype(),可作用于序列、数据框指定列或整个数据框。df.astype('float32'),返回新数据框,各列 dtype 为 float32。df['北方通信'].astype('float32') 生成新序列;写回须赋值 df['北方通信'] = ...。astype() 默认不修改原对象;未赋值则原数据框类型不变。'float32';不要与缺失值、重复值方法或 4.7 的时间转换混淆。