Pandas 数据框中的缺失值填补——前填和后填(ffill and bfill)
在处理数据时,经常会遇到数据缺失的情况。而Pandas这个Python数据分析库提供了多种方法来处理缺失值。其中,前填(ffill)和后填(bfill)的方法是常见的解决缺失值的方法之一。
阅读更多:Pandas 教程
前填和后填的介绍
前填和后填是指将数据中的空值填充为后一个或前一个有效值。比如,对于一个由以下数据组成的数据框:
A B C
0 1.0 NaN 3.0
1 NaN 6.0 NaN
2 7.0 8.0 NaN
3 NaN NaN NaN
4 10.0 4.0 2.0
如果采用前填的方法,那么缺失值所在的第1行的第2列将被填充为可用的第1行的第1列的值1.0;而采用后填的方法,则会将第3行第3列的缺失值填充为可用的第5行第2列的值4.0。
前填和后填的使用
在Pandas中,前填和后填的操作分别对应着ffill和bfill方法。使用这些方法前,我们需要先导入Pandas库和读入数据。在下面的例子中,我们使用前个例子中的数据。
import pandas as pd
# 读入数据
df = pd.read_csv("data.csv")
接下来,我们可以对数据进行缺失值填充。如果我们要使用前填操作,可以使用下面的代码实现:
# 前填操作
df.ffill()
如果我们要使用后填操作,则可以使用下面的代码:
# 后填操作
df.bfill()
另外,在Pandas中,我们还可以通过指定axis参数来选择在行方向(axis=0)或列方向(axis=1)进行填充。默认情况下,axis的取值为0,即在行方向进行前填或后填。
# 在列方向进行前填操作
df.ffill(axis=1)
值得注意的细节
在使用前填和后填方法时,我们需要注意以下几个细节:
- 数据中的空白值不能被填充:如果数据中存在空字符串,则这些位置不会被前填或后填的方法修改。也就是说,只有NaN值才能被前填和后填填充。如下例所示:
import numpy as np
import pandas as pd
# 创建一个数据框
df = pd.DataFrame({'A': ['a', 'b', np.NaN, 'c','','d']})
print(df.ffill()) # 输出结果为 a b b c c d
在上例中,我们在df的第二行填入了空字符串,此时无法使用前填或后填方法将其填充。
- 对于连续的空值,前填和后填方法的填充结果会发生变化:如果数据框中存在连续的NaN值,则将会出现一些问题。比如,在下例中,前填和后填的方法对于连续的空值填充的结果就会有所不同。
import pandas as pd
import numpy as np
df = pd.DataFrame({
"A": [np.nan, 1, np.nan, np.nan, 2],
"B": [2, np.nan, np.nan, np.nan, 4],
"C": [np.nan, 3, np.nan, np.nan, 5],
"D": [4, 5, np.nan, 8, 9]
})
# 后填操作
print(df.bfill())
# 前填操作
print(df.ffill())
在上面的例子中,我们可以看出对于连续的空值,前填和后填的方法表现出了不同的行为。具体来说,前填方法会将一个空值填为前一个非空值的值,即使这个非空值也是通过前填或后填方法填充出来的;而后填方法会根据最后一个非空值进行填充。
- 填充值并不一定真的代表了真实的数据:填充出来的数据并不代表是真实的数据,因此对于填充后的数据,我们需要根据实际情况进行进一步的分析和处理。
总结
在Pandas中,前填(ffill)和后填(bfill)方法是一种常见的处理缺失值的方法之一。通过增加缺失的数据点,我们可以使得数据点的数量达到合理的值,进而更好地分析数据。当然在使用前填和后填的方法时需要注意一些数据细节,比如连续的空值、空白值等问题,以保证处理结果的可靠性。
极客教程