1.判断dataframe是否有空值
def t2():
df = pd.DataFrame({
'name': ['lili', 'lucy','pegga','alin',np.nan],
'age': [18, 16, np.nan, 23, np.nan],
'salary': [np.nan, 300, np.nan, 1000, 800]
})
df_contains_nan = df.isnull()
print(df_contains_nan)
df_contains_nan_2 = df.isna()
print(df_contains_nan_2)
上面的代码将输出
name age salary
0 False False True
1 False False False
2 False True True
3 False False False
4 True True False
name age salary
0 False False True
1 False False False
2 False True True
3 False False False
4 True True False
isnull,isna方法都是判断df中的元素是否为空,然后输出True/False。
要判断df中是否有空元素,只需要稍加改变
def t3():
df = pd.DataFrame({
'name': ['lili', 'lucy','pegga','alin',np.nan],
'age': [18, 16, np.nan, 23, np.nan],
'salary': [np.nan, 300, np.nan, 1000, 800]
})
contains_nan = df.isnull().values.any()
print(contains_nan)
any方法只要ndarray中有任意一个元素为True就返回True。
def any(self, axis=None, out=None, keepdims=False): # real signature unknown; restored from __doc__
"""
a.any(axis=None, out=None, keepdims=False)
Returns True if any of the elements of `a` evaluate to True.
Refer to `numpy.any` for full documentation.
See Also
--------
numpy.any : equivalent function
"""
pass
2.统计空值个数
def t4():
df = pd.DataFrame({
'name': ['lili', 'lucy','pegga','alin',np.nan],
'age': [18, 16, np.nan, 23, np.nan],
'salary': [np.nan, 300, np.nan, 1000, 800]
})
# 每一列有多少个nan
nan_column = df.isnull().values.astype(int).sum(axis=0)
# 各列的nan个数
nan_column_name = df.isnull().sum()
print(nan_column)
print('*'*10)
print(nan_column_name)
print('*'*10)
# nan的总个数
nan_all = df.isnull().sum().sum()
print(nan_all)
[1 2 2]
**********
name 1
age 2
salary 2
dtype: int64
**********
5
上面的代码,展示了统计每行/列空值的个数,以及所有空值的个数。
3.按列填充空值
def t5():
df = pd.DataFrame({
'name': ['lili', 'lucy','pegga','alin',np.nan],
'age': [18, 16, np.nan, 23, np.nan],
'salary': [np.nan, 300, np.nan, 1000, 800]
})
print(df)
df.name = df.name.fillna('unknown')
df.age = df.age.fillna(df.age.mean())
df.salary = df.salary.fillna(df.salary.max())
print(df)
name age salary
0 lili 18.0 NaN
1 lucy 16.0 300.0
2 pegga NaN NaN
3 alin 23.0 1000.0
4 NaN NaN 800.0
name age salary
0 lili 18.0 1000.0
1 lucy 16.0 300.0
2 pegga 19.0 1000.0
3 alin 23.0 1000.0
4 unknown 19.0 800.0
上面的代码,分别对name, age, salary列按固定值,当前列平均值,当前列最大值填充。
fillna函数有inplace参数,下面代码的效果与之前填充一致。
def t52():
df = pd.DataFrame({
'name': ['lili', 'lucy','pegga','alin',np.nan],
'age': [18, 16, np.nan, 23, np.nan],
'salary': [np.nan, 300, np.nan, 1000, 800]
})
print(df)
df.name.fillna('unknown', inplace=True)
df.age.fillna(df.age.mean(), inplace=True)
df.salary.fillna(df.salary.max(), inplace=True)
print(df)
4.按分组平均值填充
def t6():
df = pd.DataFrame({
'level': ['A','A','A','A','B','B','B','B','C','C','C'],
'score': [2,1,3,np.nan,4,6,5,np.nan,7,9,np.nan],
})
fun = lambda x: x.fillna(df.groupby('level').score.mean()[x.level])
df = df.apply(lambda x: fun(x), axis=1)
# 以下一行代码也可以实现相同功能
#df = df.apply(lambda x: x.fillna(df.groupby('level').score.mean()[x.level]), axis=1)
print(df)
上面的代码,将score按level分组的平均值填充。
fun传入一行数据,然后通过分组值来获取当前分组的平均值,最后利用fillna来填充这个平均值即可。
代码输出如下
level score
0 A 2.0
1 A 1.0
2 A 3.0
3 A 2.0
4 B 4.0
5 B 6.0
6 B 5.0
7 B 5.0
8 C 7.0
9 C 9.0
10 C 8.0