什么是缺失值?

  直观上理解,缺失值表示的是“缺失的数据”

创建数据

index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")
data = {
    "age": [18, 30, np.nan, 40, np.nan, 30],
    "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen", np.nan, " "],
    "sex": [None, "male", "female", "male", np.nan, "unknown"],
    "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"]
}
user_info = pd.DataFrame(data=data, index=index)
# 将出生日期转为时间格式
user_info["birth"] = pd.to_datetime(user_info.birth)
user_info

识别出缺失值或非缺失值

# 识别缺失值
# True:缺失值
# False:非缺失值
user_info.isnull()

# 识别非缺失值
# True:非缺失值
# False:缺失值
user_info.notnull()

过滤掉一些缺失的行

# 过滤掉age为缺失值的行
user_info[user_info.age.notnull()]

丢弃缺失值

.dropna()

user_info.age.dropna()
"""
name
Tom      18.0
Bob      30.0
James    40.0
Alice    30.0
Name: age, dtype: float64
"""

  Seriese 使用 dropna 比较简单,对于 DataFrame 来说,可以设置更多的参数。

    axis:用于控制行或列

      axis=0 (默认):操作行

      axis=1:操作列

    how:参数可选

      any(默认):一行/列有任意元素为空时即丢弃

      all: 一行/列所有值都为空时才丢弃。

    subset:表示删除时只考虑的索引或列名。

    thresh:参数的类型为整数,比如 thresh=3,会在一行/列中至少有 3 个非空值时将其保留。

# 一行数据只要有一个字段存在空值即删除
user_info.dropna(axis=0, how="any")
# 一行数据所有字段都为空值才删除
user_info.dropna(axis=0, how="all")
# 一行数据中只要 city 或 sex 存在空值即删除
user_info.dropna(axis=0, how="any", subset=["city", "sex"])

填充缺失值

  .fillna()

使用一个标量来填充

# 将有缺失的年龄都填充为0
user_info.age.fillna(0, inplace=True)
# 将有缺失的城市都填充为china
user_info.city.fillna("china")
# 注意:空格不会被代替

使用前一个或后一个有效值来填充

  设置参数 method='pad'method='ffill' 可以使用一个有效值来填充。

user_info.age.fillna(method="ffill")

  设置参数 method='bfill'method='backfill' 可以使用一个有效值来填充。

user_info.age.fillna(method="backfill")

使用线性差值来填充

  .interpolate()

user_info.age.interpolate(inplace=True)

替换缺失值

  大家有没有想过一个问题:到底什么才是缺失值呢?你可能会奇怪说,前面不是已经说过了么, None 、 np.nan 、 NaT 这些都是缺失值。但是我也说过了,这些在 Pandas 的眼中是缺失值,有时候在我们人类的眼中,某些异常值我们也会当做缺失值来处理
  例如,在我们的存储的用户信息中,假定我们限定用户都是青年,出现了年龄为 40 的,我们就可以认为这是一个异常值。再比如,我们都知道性别分为男性(male)和女性(female),在记录用户性别的时候,对于未知的用户性别都记为了 “unknown”,很明显,我们也可以认为“unknown”是缺失值。此外,有的时候会出现空白字符串,这些也可以认为是缺失值

replace 方法:

# 将age = 40 的替换为NAN
user_info.age.replace(40, np.nan)

  对于 DataFrame,可以指定每列要替换的值:

user_info.replace({"age": 40, "birth": pd.Timestamp("1978-08-08")},np.nan)

将特定字符串进行替换

user_info.sex.replace("unknown", np.nan)

使用正则表达式来替换

#将空白字符串替换成空值
user_info.city.replace(r'\s+', np.nan, regex=True) 

使用其他对象填充

  将没有缺失值的 Series 中的元素传给有缺失值的

age_new = user_info.age.copy()
age_new.fillna(20, inplace=True)
user_info.age.combine_first(age_new)
01-13 10:52
查看更多