1. Pandas中将如下类型定义为缺失值:
NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,
‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘’, ‘N/A’, ‘NA’,
‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’,None

2. 填充缺失值
pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value:用于填充的空值的值。
method: {'backfill', 'bfill', 'pad', 'ffill', None}, default None。定义了填充空值的方法,
                pad / ffill表示用前面行/列的值,填充当前行/列的空值,
                backfill / bfill表示用后面行/列的值,填充当前行/列的空值。
axis:轴。0或'index',表示按行删除;1或'columns',表示按列删除。
inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操                            作,返回值为None。
limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前           limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被             指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)

downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。

import pandas as pd
import numpy as np


dic = {"a": [8, np.nan, np.nan, 6, 9], "b": pd.Series([np.nan, 6, np.nan, np.nan, 10]), "c": ["qq", np.nan, np.nan, np.nan, 88]}  # DataFrame的col2的"B"和"C"行为nan
df = pd.DataFrame(dic)
print("df = \n", df, sep="")

# pd.isna(df) 判断是否是nan
print("pd.isna(df) = \n", pd.isna(df), sep="")

# pd.notna(df) 判断是否不是nan
print("pd.notna(df) = \n", pd.notna(df), sep="")


# 注:inplace默认为False,表示pd.fillna()返回一个新的DataFrame,原df不变(下面均设置为False);如果设置为True则表示在原df上填充,返回None
# 1. df.fillna(value), df中的所有的nan都用单一的value替换并返回
df2 = df.fillna(10,
                method=None,
                axis=1,  # axis=0或"index":沿着行的向(纵向); axis=1或"column":是沿着列的方向(横向)
                limit=2,   # 在没指定method的情况下,沿着axis指定方向上填充的个数不大于limit设定值
                inplace=False)  # 返回新的DataFrame
print("用10替换后的df2 = \n", df2)

# 2. 用字典的方式填充nan
dic2 = {"a": 0, "b": 1, "c": 2}  # 字典的key为column
df4 = df.fillna(dic2,
                axis=0,  # 用字典填充时,只能设置为0
                limit=2,  # 最多替换2个
                inplace=False)  # 返回新的DataFrame
print("用字典替换后的df = \n", df4)

# 3. 用DataFrame替换
df5 = pd.DataFrame(np.arange(10).reshape((5, 2)), columns=["a", "b"])
df6 = df.fillna(df5, inplace=False)  # df的"c"列在df5中不存在,所以不受影响
print("用DataFrame替换后的df = \n", df6)

# 2.  df.fillna(method="ffill")  method=ffill用前一个值替换nan,method=bfill用后一个值替换nan,如果nan没有前一个或者后一个值,nan将不会被替换
df3 = df.fillna(method="ffill",
                axis=0,  # axis=0或"index":沿着行的前一个或者后一个值替换nan; axis=1或"column":是沿着列的前一个或后一个值替换nan
                limit=1,  # 在指定method的情况下,连续填充的nan数量不超过limit设定值
                inplace=False)  # 返回新的DataFrame
print(df)
print("用前一个值替换后的df = \n", df3)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐