pandas 替换nan
1. 介绍
在数据处理中,经常会遇到缺失值的情况,即数据中存在空值或NaN(Not a Number)的情况。这些缺失值可能会影响数据分析的结果。而pandas是Python中一个强大的数据处理库,提供了直观灵活的数据结构和数据操作方法。其中就包括了替换缺失值的功能,可以帮助我们更好地处理数据。
本文将详细介绍pandas中替换NaN的方法和技巧,帮助读者更好地理解和应用。
2. pandas替换NaN的方法
2.1 fillna()方法
pandas中的fillna()方法可以用来替换缺失值。它的基本用法如下:
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
其中,常用的参数包括:
- value: 要替换的值,可以是一个常数或者一个字典。如果是常数,则所有的NaN都会被替换为该常数;如果是字典,则根据字典的键值对替换。
- method: 填充缺失值的方法,可以是’ffill’(用前一个非缺失值替换),’bfill’(用后一个非缺失值替换)。
- axis: 指定要填充的轴,0表示行,1表示列。
- inplace: 是否修改原始数据,默认为False。
- limit: 在指定轴上连续填充的最大次数。
- downcast: 指定数据类型,可以是’infer’(自动推断)或其他的数据类型。
接下来我们通过几个示例来展示使用fillna()方法替换NaN的操作。
2.2 示例代码1:用常数替换NaN
首先,我们导入pandas库和创建一个包含NaN的DataFrame。
import pandas as pd
import numpy as np
data = {'A': [1, 2, np.nan, 4, 5],
'B': [6, np.nan, 8, np.nan, 10],
'C': [np.nan, 12, 13, 14, 15]}
df = pd.DataFrame(data)
print(df)
运行结果如下:
A B C
0 1.0 6.0 NaN
1 2.0 NaN 12.0
2 NaN 8.0 13.0
3 4.0 NaN 14.0
4 5.0 10.0 15.0
我们可以使用fillna()方法将NaN替换为指定的常数。下面的示例中,我们将NaN替换为0。
df.fillna(0, inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 6.0 0.0
1 2.0 0.0 12.0
2 0.0 8.0 13.0
3 4.0 0.0 14.0
4 5.0 10.0 15.0
可以看到,所有的NaN都被替换为了0。
2.3 示例代码2:用前一个非缺失值替换NaN
接下来,我们使用前一个非缺失值替换NaN。下面的示例中,我们使用fillna()方法用前一个非缺省值替换NaN。
df.fillna(method='ffill', inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 6.0 0.0
1 2.0 6.0 12.0
2 2.0 8.0 13.0
3 4.0 8.0 14.0
4 5.0 10.0 15.0
可以看到,第一列的NaN被前一个非缺失值1替换,第二列的NaN被前一个非缺失值6替换,第三列的NaN被前一个非缺失值0替换。
2.4 示例代码3:用后一个非缺失值替换NaN
除了使用前一个非缺失值替换NaN,我们也可以使用后一个非缺失值进行替换。下面的示例中,我们使用fillna()方法用后一个非缺省值替换NaN。
df.fillna(method='bfill', inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 6.0 0.0
1 2.0 8.0 12.0
2 4.0 8.0 13.0
3 4.0 10.0 14.0
4 5.0 10.0 15.0
可以看到,第一列的NaN被后一个非缺失值2替换,第二列的NaN被后一个非缺失值8替换,第三列的NaN被后一个非缺失值12替换。
2.5 示例代码4:根据字典替换NaN
除了使用常数或者前一个/后一个非缺失值进行替换,我们还可以根据字典进行替换。下面的示例中,我们使用fillna()方法将列B中的NaN替换为字典中对应的值。
values = {'B': 20}
df.fillna(value=values, inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 6.0 0.0
1 2.0 20.0 12.0
2 4.0 8.0 13.0
3 4.0 20.0 14.0
4 5.0 10.0 15.0
可以看到,第二列的NaN被替换为了字典中对应的值20。
2.6 示例代码5:按轴填充缺失值
当数据处理时,我们有时候需要按行或列填充缺失值。在fillna()方法中,我们可以通过axis参数指定要填充的轴。下面的示例中,我们按行填充缺失值。
df.fillna(method='ffill', axis=0, inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 6.0 0.0
1 2.0 6.0 12.0
2 2.0 8.0 13.0
3 4.0 8.0 14.0
4 5.0 10.0 15.0
可以看到,按行填充后,第一行的NaN被前一个非缺失值替换,第二行的NaN被前一个非缺失值替换,以此类推。
2.7 示例代码6:限制填充次数
在使用fillna()方法填充缺失值时,我们可以通过limit参数来限制连续填充的次数。下面的示例中,我们将limit参数设置为1,限制每列连续填充一次。
df.fillna(method='ffill', limit=1, inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 6.0 0.0
1 2.0 6.0 12.0
2 2.0 8.0 13.0
3 4.0 8.0 14.0
4 5.0 10.0 15.0
可以看到,每列只填充了一次,后续的NaN没有再进行填充。
2.8 示例代码7:替换特定值
有时候,我们希望将除了NaN之外的特定值替换为其他值。在fillna()方法中,我们可以使用replace()方法来实现。下面的示例中,我们将除了NaN之外的值为6的元素替换为999。
df.replace(to_replace=6, value=999, inplace=True)
print(df)
运行结果如下:
A B C
0 1.0 999.0 0.0
1 2.0 999.0 12.0
2 2.0 8.0 13.0
3 4.0 999.0 14.0
4 5.0 10.0 15.0
可以看到,除了NaN,值为6的元素都被替换为了999。
2.9 示例代码8:使用inplace进行原地替换
在使用fillna()方法时,默认情况下原始的DataFrame不会被修改,而是返回一个新的DataFrame。如果想要在原始DataFrame上进行操作,可以将inplace参数设置为True。下面的示例中,我们先创建一个副本df2用于演示。
df2 = df.copy()
df2.fillna(0, inplace=True)
print(df2)
运行结果如下:
A B C
0 1.0 999.0 0.0
1 2.0 999.0 12.0
2 2.0 8.0 13.0
3 4.0 999.0 14.0
4 5.0 10.0 15.0
可以看到,副本df2中的NaN被替换为了0。
3. 总结
本文介绍了pandas中替换NaN的方法,包括使用fillna()方法按指定的常数、前一个非缺失值、后一个非缺失值替换NaN,使用字典替换NaN,按轴填充缺失值,限制填充次数,替换特定值以及进行原地替换的方法。
通过掌握这些替换NaN的方法,我们可以更好地处理数据中的缺失值,确保数据分析的准确性和可靠性。同时,在不同的场景下选择合适的替换方法,能够提高数据处理的效率。