看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们接触到数据往往会存在一些缺失值,为了数据分析建立模型,我们会按照一写的规则将这些缺失进行填充修补。pandas 的 DataFrame、Series、时间序列都支持缺失值填充操作。本文将一一介绍 fillna() 在这些对象中的使用。
pandas 的以下对象支持 fillna() 方法:
在 DataFrame 和 Series 等对象上的 replace() 方法的参数是:
fillna(
self,
value: 'object | ArrayLike | None' = None,
method: 'FillnaOptions | None' = None,
axis: 'Axis | None' = None,
inplace: 'bool' = False,
limit=None,
downcast=None,
)
使用指定的方法填充 NA/NaN 值。
它的参数有:
注意,在 DataFrameGroupBy 中使用时和通用方法一样,因为每个分组是一个 DataFrame。
以下是一些通用功能的示例:
df = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, np.nan],
[np.nan, 3, np.nan, 4]],
columns=list("ABCD"))
df
'''
A B C D
0 NaN 2.0 NaN 0.0
1 3.0 4.0 NaN 1.0
2 NaN NaN NaN NaN
3 NaN 3.0 NaN 4.0
'''
# 将所有NaN元素替换为0
df.fillna(0)
'''
A B C D
0 0.0 2.0 0.0 0.0
1 3.0 4.0 0.0 1.0
2 0.0 0.0 0.0 0.0
3 0.0 3.0 0.0 4.0
'''
# 我们还可以向前或向后传播非null值。
df.fillna(method="ffill")
'''
A B C D
0 NaN 2.0 NaN 0.0
1 3.0 4.0 NaN 1.0
2 3.0 4.0 NaN 1.0
3 3.0 3.0 NaN 4.0
'''
# 将列“A”、“B”、“C”和“D”中的所有NaN元素
# 分别替换为0、1、2和3
values = {"A": 0, "B": 1, "C": 2, "D": 3}
df.fillna(value=values)
'''
A B C D
0 0.0 2.0 2.0 0.0
1 3.0 4.0 2.0 1.0
2 0.0 1.0 2.0 3.0
3 0.0 3.0 2.0 4.0
'''
# 仅替换第一个NaN元素
df.fillna(value=values, limit=1)
'''
A B C D
0 0.0 2.0 2.0 0.0
1 3.0 4.0 NaN 1.0
2 NaN 1.0 NaN 3.0
3 NaN 3.0 NaN 4.0
'''
# 使用 DataFrame 填充时,替换将沿着相同的列名和索引进行
# 请注意,D列不受影响,因为它在df2中不存在
df2 = pd.DataFrame(np.zeros((4, 4)), columns=list("ABCE"))
df.fillna(df2)
'''
A B C D
0 0.0 2.0 0.0 0.0
1 3.0 4.0 0.0 1.0
2 0.0 0.0 0.0 NaN
3 0.0 3.0 0.0 4.0
'''
pandas 的索引对象支持的语法功能有些不同,语法为:
pd.Index.fillna(self, value=None, downcast=None)
参数为:
在统计学中,插补是用替代值替换缺失数据的过程。重新采样数据时,可能会出现缺失值(例如,当重新采样频率高于原始频率时)。
它填充上采样引入的缺失值,语法为:
Resampler.fillna(method, limit=None)
将不会修改原始数据中存在的缺失值。
参数:
参数为的意义与通用的语法中的相同。
示例:
# Series:
s = pd.Series([1, 2, 3],
index=pd.date_range('20180101', periods=3, freq='h'))
s
'''
2018-01-01 00:00:00 1
2018-01-01 01:00:00 2
2018-01-01 02:00:00 3
Freq: H, dtype: int64
'''
# 在不填充缺失值的情况下,您可以获得:
s.resample("30min").asfreq()
'''
2018-01-01 00:00:00 1.0
2018-01-01 00:30:00 NaN
2018-01-01 01:00:00 2.0
2018-01-01 01:30:00 NaN
2018-01-01 02:00:00 3.0
Freq: 30T, dtype: float64
'''
s.resample('30min').fillna("backfill")
'''
2018-01-01 00:00:00 1
2018-01-01 00:30:00 2
2018-01-01 01:00:00 2
2018-01-01 01:30:00 3
2018-01-01 02:00:00 3
Freq: 30T, dtype: int64
'''
s.resample('15min').fillna("backfill", limit=2)
'''
2018-01-01 00:00:00 1.0
2018-01-01 00:15:00 NaN
2018-01-01 00:30:00 2.0
2018-01-01 00:45:00 2.0
2018-01-01 01:00:00 2.0
2018-01-01 01:15:00 NaN
2018-01-01 01:30:00 3.0
2018-01-01 01:45:00 3.0
2018-01-01 02:00:00 3.0
Freq: 15T, dtype: float64
'''
s.resample('30min').fillna("pad")
'''
2018-01-01 00:00:00 1
2018-01-01 00:30:00 1
2018-01-01 01:00:00 2
2018-01-01 01:30:00 2
2018-01-01 02:00:00 3
Freq: 30T, dtype: int64
'''
s.resample('30min').fillna("nearest")
'''
2018-01-01 00:00:00 1
2018-01-01 00:30:00 2
2018-01-01 01:00:00 2
2018-01-01 01:30:00 3
2018-01-01 02:00:00 3
Freq: 30T, dtype: int64
'''
# 上采样前存在的缺失值不受影响。
sm = pd.Series([1, None, 3],
index=pd.date_range('20180101', periods=3, freq='h'))
sm
'''
2018-01-01 00:00:00 1.0
2018-01-01 01:00:00 NaN
2018-01-01 02:00:00 3.0
Freq: H, dtype: float64
'''
sm.resample('30min').fillna('backfill')
'''
2018-01-01 00:00:00 1.0
2018-01-01 00:30:00 NaN
2018-01-01 01:00:00 NaN
2018-01-01 01:30:00 3.0
2018-01-01 02:00:00 3.0
Freq: 30T, dtype: float64
'''
sm.resample('30min').fillna('pad')
'''
2018-01-01 00:00:00 1.0
2018-01-01 00:30:00 1.0
2018-01-01 01:00:00 NaN
2018-01-01 01:30:00 NaN
2018-01-01 02:00:00 3.0
Freq: 30T, dtype: float64
'''
sm.resample('30min').fillna('nearest')
'''
2018-01-01 00:00:00 1.0
2018-01-01 00:30:00 NaN
2018-01-01 01:00:00 NaN
2018-01-01 01:30:00 3.0
2018-01-01 02:00:00 3.0
Freq: 30T, dtype: float64
'''
# 数据帧重采样是按列进行的,所有相同的选项都可用
df = pd.DataFrame({'a': [2, np.nan, 6], 'b': [1, 3, 5]},
index=pd.date_range('20180101', periods=3,
freq='h'))
df
'''
a b
2018-01-01 00:00:00 2.0 1
2018-01-01 01:00:00 NaN 3
2018-01-01 02:00:00 6.0 5
'''
df.resample('30min').fillna("bfill")
'''
a b
2018-01-01 00:00:00 2.0 1
2018-01-01 00:30:00 NaN 3
2018-01-01 01:00:00 NaN 3
2018-01-01 01:30:00 6.0 5
2018-01-01 02:00:00 6.0 5
'''
pandas 的数组扩展对象 pandas.api.extensions.ExtensionArray.fillna
支持语法为:
ExtensionArray.fillna(value=None, method=None, limit=None)
参数也与通用语法相同:
以下是一些相关的特殊方法:
更新时间:June 3, 2022, 1:53 p.m. 标签:pandas 缺失值