fillna、ffill、bfill¶
fillna(value=None, method=None, axis=0, inplace=False, limit=None, downcast=None)
**沿axis**指定填充缺失数据
ffill(axis=0, inplace=False, limit=None, downcast=None)
替代df.pad(),等价于fillna(method="ffill")
bfill(axis=0, inplace=False, limit=None, downcast=None)
替代df.backfill(),等价于fillna(method="bfill")
-
value:可选,决定填充的数据, 不能与method参数同时指定,默认None
-
数值:根据limit【默认None(所有)】填充,
-
字典、Series对象:将指定索引对应的缺失数据填充,此时axis只能是0或"index"
-
DataFrame对象:以对应索引数据进行填充,与axis、limit无关。只适用于DataFrame对象
-
method【已弃用】: 可选,决定填充的数据, 不能与value参数同时指定,默认None
-
'bfill'、'backfill':以非空值后一个值进行填充
-
'ffill':以非空值前一个值进行填充
-
axis:
-
对于Series对象:只能是0或"index"(默认)
-
对于DateFrame对象:可以是0或"index"(默认),也可以是1或"columns"
-
inplace: 是否直接修改原对象,如果为False(默认),将返回副本;如果为True则返回None,直接修改原对象
-
limit: 可选None或者>0的数
-
method参数未指定:表示填充缺失数据的最大数
-
method参数指定:表示向前或向后填充的连续缺失数据的最大数
-
downcast:
label = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j"]
s = pd.Series([85, 97, 90, np.nan, np.nan, np.nan, 83, 85, np.nan, 76], index=label)
print(s)
"""
a 85.0
b 97.0
c 90.0
d NaN
e NaN
f NaN
g 83.0
h 85.0
i NaN
j 76.0
dtype: float64
"""
print(s.fillna(value=0))
"""
a 85.0
b 97.0
c 90.0
d 0.0
e 0.0
f 0.0
g 83.0
h 85.0
i 0.0
j 76.0
dtype: float64
"""
print(s.fillna(value={"a": 1, "d": 0}))
"""
a 85.0
b 97.0
c 90.0
d 0.0
e NaN
f NaN
g 83.0
h 85.0
i NaN
j 76.0
dtype: float64
"""
print(s.fillna(value=pd.Series({"a": 1, "d": 0})))
"""
a 85.0
b 97.0
c 90.0
d 0.0
e NaN
f NaN
g 83.0
h 85.0
i NaN
j 76.0
dtype: float64
"""
print(s.fillna(method="bfill"))
print(s.bfill())
"""
a 85.0
b 97.0
c 90.0
d 83.0
e 83.0
f 83.0
g 83.0
h 85.0
i 76.0
j 76.0
dtype: float64
"""
print(s.fillna(method="ffill"))
print(s.ffill())
"""
a 85.0
b 97.0
c 90.0
d 90.0
e 90.0
f 90.0
g 83.0
h 85.0
i 85.0
j 76.0
dtype: float64
"""
print(s.fillna(value=0, limit=2))
"""
a 85.0
b 97.0
c 90.0
d 0.0
e 0.0
f NaN
g 83.0
h 85.0
i NaN
j 76.0
dtype: float64
"""
print(s.fillna(method="bfill", limit=2))
print(s.bfill(limit=2))
"""
a 85.0
b 97.0
c 90.0
d NaN
e 83.0
f 83.0
g 83.0
h 85.0
i 76.0
j 76.0
dtype: float64
"""
print(s.fillna(method="ffill", limit=2))
print(s.ffill(limit=2))
"""
a 85.0
b 97.0
c 90.0
d 90.0
e 90.0
f NaN
g 83.0
h 85.0
i 85.0
j 76.0
dtype: float64
"""
data = {"语文": [1, None, None, None],
"数学": [1, 2, None, 4],
"英语": [None, None, None, 4],
"历史": [1, None, 3, 4]
}
index = ["小明", "小红", "小亮", "小刚"]
df4 = pd.DataFrame(data=data, index=index)
print(df4)
"""
语文 数学 英语 历史
小明 1.0 1.0 NaN 1.0
小红 NaN 2.0 NaN NaN
小亮 NaN NaN NaN 3.0
小刚 NaN 4.0 4.0 4.0
"""
df_fillna_limit = df4.fillna(value=0, limit=2)
print(df_fillna_limit)
"""
语文 数学 英语 历史
小明 1.0 1.0 0.0 1.0
小红 0.0 2.0 0.0 0.0
小亮 0.0 0.0 NaN 3.0
小刚 NaN 4.0 4.0 4.0
"""
df_fillna_limit = df4.fillna(value=0, axis="columns", limit=2)
print(df_fillna_limit)
"""
语文 数学 英语 历史
小明 1.0 1.0 0.0 1.0
小红 0.0 2.0 0.0 NaN
小亮 0.0 0.0 NaN 3.0
小刚 0.0 4.0 4.0 4.0
"""
df_fillna_dict = df4.fillna(value={"语文": 0, "英语": 1}, limit=2)
print(df_fillna_dict)
"""
语文 数学 英语 历史
小明 1.0 1.0 1.0 1.0
小红 0.0 2.0 1.0 NaN
小亮 0.0 NaN NaN 3.0
小刚 NaN 4.0 4.0 4.0
"""
df = pd.DataFrame(data={"语文": [0, 3], "英语": [0, 1]}, index=["小明", "小红"])
print(df)
df_fillna_df = df4.fillna(value=df)
print(df_fillna_df)
"""
语文 英语
小明 0 0
小红 3 1
语文 数学 英语 历史
小明 1.0 1.0 0.0 1.0
小红 3.0 2.0 1.0 NaN
小亮 NaN NaN NaN 3.0
小刚 NaN 4.0 4.0 4.0
"""
df_ffill = df4.ffill(limit=2)
print(df_ffill)
"""
语文 数学 英语 历史
小明 1.0 1.0 NaN 1.0
小红 1.0 2.0 NaN 1.0
小亮 1.0 2.0 NaN 3.0
小刚 NaN 4.0 4.0 4.0
"""
df_ffill = df4.ffill(axis=1, limit=2)
print(df_ffill)
"""
语文 数学 英语 历史
小明 1.0 1.0 1.0 1.0
小红 NaN 2.0 2.0 2.0
小亮 NaN NaN NaN 3.0
小刚 NaN 4.0 4.0 4.0
"""
df_bfill = df4.bfill(limit=2)
print(df_bfill)
"""
语文 数学 英语 历史
小明 1.0 1.0 NaN 1.0
小红 NaN 2.0 4.0 3.0
小亮 NaN 4.0 4.0 3.0
小刚 NaN 4.0 4.0 4.0
"""
df_bfill = df4.bfill(axis=1, limit=2)
print(df_bfill)
"""
语文 数学 英语 历史
小明 1.0 1.0 1.0 1.0
小红 2.0 2.0 NaN NaN
小亮 NaN 3.0 3.0 3.0
小刚 4.0 4.0 4.0 4.0
"""
replace¶
Series.replace(to_replace=None, value=<no_default>, inplace=False, limit=None, regex=False, method=<no_default>)
将Series对象中的to_replace值替换为value,返回副本
-
to_replace:
-
单值:匹配后直接替换为value
-
列表:若value也为列表,则二者长度必须相同。若regex=True,则列表中所有字符串将被解释为正则表达式
-
字典:通过映射关系进行替换,无映射关系的数据仍然保留
-
Series对象:不应指定value参数
-
DataFrame对象:在不指定value参数的情况下,根据字典映射进行替换;指定value参数的情况下,二者键值对表示对应列与对应值的映射关系,此时value参数只能指定为单值或字典
-
-
None:此时regex必须指定
-
value:用来替换的值或值的列表
-
inplace:是否在原Series对象上进行替换,默认False
-
limit:已弃用,未来版本将会移除
-
regex:是否将to_replace和/或value解释为正则表达式,默认为False。或者可以是正则表达式或正则表达式列表、字典或数组,此时to_replace必须为None
-
method:已弃用,未来版本将会移除
label = ["a", "b", "c", "d", "e", "f", "g", "h"]
s = pd.Series([85, 100, 90, np.nan, 90, 85, np.nan, 90], index=label)
print(s)
"""
a 85.0
b 100.0
c 90.0
d NaN
e 90.0
f 85.0
g NaN
h 90.0
dtype: float64
"""
print(s.replace(np.nan, 0))
"""
a 85.0
b 100.0
c 90.0
d 0.0
e 90.0
f 85.0
g 0.0
h 90.0
dtype: float64
"""
print(s.replace([np.nan, 90, 85], 0))
"""
a 0.0
b 100.0
c 0.0
d 0.0
e 0.0
f 0.0
g 0.0
h 0.0
dtype: float64
"""
print(s.replace([np.nan, 90, 85], [0, 95, 90]))
"""
a 90.0
b 100.0
c 95.0
d 0.0
e 95.0
f 90.0
g 0.0
h 95.0
dtype: float64
"""
print(s.replace({np.nan: 0, 90: 95, 85: 90}))
"""
a 90.0
b 100.0
c 95.0
d 0.0
e 95.0
f 90.0
g 0.0
h 95.0
dtype: float64
"""
data = [[90, 90, 100], [100, 80, 80], [90, 90, 80]]
index = ["小明", "小红", "小亮"]
columns = ["语文", "数学", "英语"]
df1 = pd.DataFrame(data=data, index=index, columns=columns)
print(df1)
"""
语文 数学 英语
小明 90 90 100
小红 100 80 80
小亮 90 90 80
"""
print(df1.replace(90, 95))
"""
语文 数学 英语
小明 95 95 100
小红 100 80 80
小亮 95 95 80
"""
print(df1.replace([90, 80], 95))
"""
语文 数学 英语
小明 95 95 100
小红 100 95 95
小亮 95 95 95
"""
print(df1.replace([90, 80], [95, 85]))
print(df1.replace({90: 95, 80: 85}))
"""
语文 数学 英语
小明 95 95 100
小红 100 85 85
小亮 95 95 85
"""
print(df1.replace({"语文": 90, "数学": 80}, value=0))
"""
语文 数学 英语
小明 0 90 100
小红 100 0 80
小亮 0 90 80
"""
print(df1.replace({"语文": 90, "数学": 80}, value={"语文": 95, "数学": 85}))
print(df1.replace({"语文": {90: 95}, "数学": {80: 85}}))
"""
语文 数学 英语
小明 95 90 100
小红 100 85 80
小亮 95 90 80
"""