处理丢失数据
有两种丢失的数据:
-- None
-- np.nan(NaN)
1.NoneNone是Python自带的,其类型为python object。因此,None不能参与到任何计算中
object类型的运算要比int类型的运算慢得多
2.np.nan(NaN)np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN
但可以使用np.nan() 函数来计算nan,此时视nan为 3.pandas中的None与NaN (1) pandas中None与np.nan都视作np.nan
(1) 判断函数:
df.isnull()
df.isnull.any()
df.isnull.all()
df.notnull()
df.notnull.any()
df.notnull.all()
'''具体的代码实例以及功能如下:''''
from pandas import DataFrame, Series
import numpy as np
df = DataFrame({"age": [20, 21, 19, 22, 23], 'salary': [10000, 11000, 9900, 8500, 15000]},
index=['张三', '李四', '小赵', '小王', '小冯'], columns=['age', 'salary', 'work'])
df.work['李四':'小王'] = 'python'
print(df)
"""
age salary work
张三 20 10000 NaN
李四 21 11000 python
小赵 19 9900 python
小王 22 8500 python
小冯 23 15000 NaN
"""
'''1.调用isnull()方法,判断是否为空'''
print(df.isnull())
"""
age salary work
张三 False False True
李四 False False False
小赵 False False False
小王 False False False
小冯 False False True
"""
'''2. isnull().any() 只有数据有一个为空,即为True
any(axis=0):只要数据有一个为True就为这“列”就为True
any(axis=1):只要数据有一个为True就为这“行”就为True'''
s1 = df.isnull().any(axis=1)
'''(获取数据为空的数据)把获得的Series在使用DataFrame取值'''
print(df[s1])
"""
age salary work
张三 20 10000 NaN
小冯 23 15000 NaN
"""
'''3.isnull().all() 数据全部为空时,才为True,axis同any()'''
print(df.isnull().all(axis=1))
"""
张三 False
李四 False
小赵 False
小王 False
小冯 False
dtype: bool
"""
'''4.notnull() 判断数据是否不为空'''
print(df.notnull())
"""
age salary work
张三 True True False
李四 True True True
小赵 True True True
小王 True True True
小冯 True True False
"""
''' 5notnull().any() 只有数据有一个不为空,即为True
any(axis=0):只要数据有一个不为True就为这“列”就为True
any(axis=1):只要数据有一个不为True就为这“行”就为True'''
print(df.notnull().any(axis=1))
"""
张三 True
李四 True
小赵 True
小王 True
小冯 True
dtype: bool
"""
'''6.notnull().all() 数据全部不为空时,才为True,axis同any()'''
s2 = df.notnull().all(axis=1)
print(s2)
"""
张三 False
李四 True
小赵 True
小王 True
小冯 False
dtype: bool
"""
'''取出没有一个空值的数据'''
print(df[s2])
"""
age salary work
李四 21 11000 python
小赵 19 9900 python
小王 22 8500 python
"""
'(2) 过滤函数
· dropna() 可以选择过滤的是行还是列(默认为行) , 也可以选择过滤的方式 参数 :how='all'
'''dropna(),中的参数axis默认为0,即为行'''
'''一行数据只要有一个为空就进行删除,如果加上参数how='all'代表一行都为空时才删除'''
print(df.dropna())
"""
age salary work
李四 21 11000 python
小赵 19 9900 python
小王 22 8500 python
"""
'''一列数据只要有一个为空就进行删除,参数how='all'代表一列都为空时才删除'''
print(df.dropna(axis=1))
"""
age salary
张三 20 10000
李四 21 11000
小赵 19 9900
小王 22 8500
小冯 23 15000
"""
(3) 填充函数 Series/DataFrame
-- fillna() 参数value='' 即为要填充的值
method:对应的值 'bfill'(选择后面的填充)或者'ffill(选择前面的填充)
inplace:True 是否选择在原来的基础上修改,加上该参数没有返回值
'''fillna() 填充所有的空值'''
print(df.fillna(value="填充值"))
"""
age salary work
张三 20 10000 填充值
李四 21 11000 python
小赵 19 9900 python
小王 22 8500 python
小冯 23 15000 填充值
"""
'''可以选择向前填充还是向后填充
参数method:对应的值 'bfill'(选择后面的填充)或者'ffill(选择前面的填充)
inplace:True 是否选择在原来的基础上修改,没有返回值
对于DataFrame来说,选择填充的轴axis.
-- axis=0 index/行
-- axis=1 columns/列'''
print(df.fillna(method='bfill'))
""" # 因为最后一个后面没有值,所以最后一个填充还是为NaN
age salary work
张三 20 10000 python
李四 21 11000 python
小赵 19 9900 python
小王 22 8500 python
小冯 23 15000 NaN
"""
print(df.fillna(method='ffill'))
""" # 因为第一个的前没有值,所以第一个填充还是NaN
age salary work
张三 20 10000 NaN
李四 21 11000 python
小赵 19 9900 python
小王 22 8500 python
小冯 23 15000 python
"""