[数据清洗] 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