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
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持IT俱乐部。