[数据清洗] pandas dataframe空值的处理方法

基础篇:

#下文以df代表dataframe的名字:


  • 1. 确定空值位置:

在导入dataframe之后,一个非常好的习惯就是及时检查一下每一列是否有空值,用下面的语句可以简单实现这个需求:

df.isnull().any()

上面的这行代码可以返回各个列是否有空值的情况,比如下面这样:

Unnamed: 0      
A                False
B                True
C                True
D                False
dtype: bool

这样我们可以得知, B列和C列有空值存在, 在用到这两列数据的时候,需要考虑对空值的处理方法。


  • 2. 处理空值的两种办法:删除 or 填充


删除:

删除空值主要使用下面这个语句:

df.dropna()
#Signature: df.dropna(axis=0, how='any', 
                     thresh=None, subset=None, inplace=False)

axis代表删除整行or整列,默认axis = 0, 也就是删除行。

how默认为‘any’, 也就是删除任何含有空值的行/列。此外how = ‘all’, 则会删除全部为空值的行/列。

thresh可以用来限定删除有几个空值的行/列,如thresh = 3, 则删除有3个空值的行/列。

subset非常有用,如果想删除所有列A 空值所在行:

df.dropna(axis = 0, subset = ['A'] )



填充:

填充空值主要使用下面这个语句:

df.fillna( )

#Signature: df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)


value可以是一个值(标量),比如我们用一列的均值来填充该列的所有空值:

df['column_name'].fillna(value = df['column_name'].mean()]

value 也可以是 dict, Series, 甚至 DataFrame,比如我们可以用字典来实现对不同的列填充不同的值:

df.fillna({'column_name_A': 0,'column_name_B': 100})


两个series相加,根据常识我们可以知道index不同的地方会变成空值,如下图

s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
s2 = pd.Series([10, 20, 30, 40], index=['c', 'd', 'e', 'f'])
s1 + s2
a     NaN
b     NaN
c    13.0
d    24.0
e     NaN