Skip to content

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")

  1. value:可选,决定填充的数据, 不能与method参数同时指定,默认None

  2. 数值:根据limit【默认None(所有)】填充,

  3. 字典、Series对象:将指定索引对应的缺失数据填充,此时axis只能是0或"index"

  4. DataFrame对象:以对应索引数据进行填充,与axis、limit无关。只适用于DataFrame对象

  5. method【已弃用】: 可选,决定填充的数据, 不能与value参数同时指定,默认None

  6. 'bfill'、'backfill':以非空值后一个值进行填充

  7. 'ffill':以非空值前一个值进行填充

  8. axis:

  9. 对于Series对象:只能是0或"index"(默认)

  10. 对于DateFrame对象:可以是0或"index"(默认),也可以是1或"columns"

  11. inplace: 是否直接修改原对象,如果为False(默认),将返回副本;如果为True则返回None,直接修改原对象

  12. limit: 可选None或者>0的数

  13. method参数未指定:表示填充缺失数据的最大数

  14. method参数指定:表示向前或向后填充的连续缺失数据的最大数

  15. 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,返回副本

  1. to_replace

  2. 单值:匹配后直接替换为value

  3. 列表:若value也为列表,则二者长度必须相同。若regex=True,则列表中所有字符串将被解释为正则表达式

  4. 字典:通过映射关系进行替换,无映射关系的数据仍然保留

    1. Series对象:不应指定value参数

    2. DataFrame对象:在不指定value参数的情况下,根据字典映射进行替换;指定value参数的情况下,二者键值对表示对应列与对应值的映射关系,此时value参数只能指定为单值或字典

  5. None:此时regex必须指定

  6. value:用来替换的值或值的列表

  7. inplace:是否在原Series对象上进行替换,默认False

  8. limit:已弃用,未来版本将会移除

  9. regex:是否将to_replace和/或value解释为正则表达式,默认为False。或者可以是正则表达式或正则表达式列表、字典或数组,此时to_replace必须为None

  10. 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
"""

Comments