导入调查数据时,经常需要检查数据中是否存在错误,处理特殊值,将数据转换为不同的格式并进行计算。这些操作都称为数据清洗(data cleaning)。

nsfg.py包含一个CleanFemPreg函数,用于清洗计划使用的变量。

def CleanFemPreg(df): 
    df.agepreg /= 100.0

    na_vals = [97, 98, 99]
    df.birthwgt_lb.replace(na_vals, np.nan, inplace=True)
    df.birthwgt_oz.replace(na_vals, np.nan, inplace=True)

    df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0

agepreg包含母亲在妊娠结束时的年龄。在数据文件中,agepreg是以百分之一年为单位的整数值。因此CleanFemPreg的第一行将每个agepreg除以100,从而获得以年为单位的浮点数值。

birthwgt_lbbirthwgt_oz包含成功生产时的新生儿体重,分别是磅和盎司的部分。这两个变量还使用几个特殊的代码。

97 NOT ASCERTAINED 
98 REFUSED 
99 DON'T KNOW

用数字编码特殊值是一种危险的做法,因为如果没有进行正确的处理,这些数字可能产生虚假结果,例如,99磅重的新生儿。replace方法可以将这些值替换为np.nan,这是一个特殊的浮点数值,表示“不是数字”。replace方法使用inplace标识,说明直接修改现有的Series对象,而不是创建新对象。

IEEE浮点数表示法标准中规定,在任何算术运算中,如果有参数为nan,结果都返回nan

>>> import numpy as np
>>> np.nan / 100.0
nan

因此使用nan进行计算会得到正确的结果,而且大部分的pandas函数都能恰当地处理nan。但我们经常需要处理数据缺失的问题。

CleanFemPreg函数的最后一行生成一个新列totalwgt_lb,将磅和盎司值结合在一起,得到一个以磅为单位的值。

需要注意的是,向DataFrame添加新列时,必须使用如下字典语法:

# 正确 
df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0 

而不是使用点标记:

# 错误!
df.totalwgt_lb = df.birthwgt_lb + df.birthwgt_oz / 16.0

使用点标记的写法会给DataFrame对象添加一个新属性,而不是创建一个新列。

30:00