Pandas中的缺失值分析:None 与 NaN 的区别

Python中的None

None是Python自带的,其类型为python object。因此,None不能参与到任何计算中。

# None是个python对象, 它是不能参与到任何计算中
type(None) # NoneType

# None + 1 # TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

np.nan(NaN)

np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。

但可以使用np.nan*()函数来计算nan,此时视nan为0。

import numpy as np

# np.nan是浮点类型
type(np.nan) # float

# 可以参与计算, 但是结果总是np.nan
np.nan + 1 # nan

# np.nansum函数中,np.nan 看成0参与计算中
np.nansum(np.array([1, 2, 3, np.nan]))  # 6.0

pandas中的None与NaN

pandas中None与np.nan处理成np.nan

from pandas import DataFrame, Series
import pandas as pd
data = np.random.randint(0, 150, size=(4, 4))
index = ['张三', '李四', '王五', '赵六']
columns = ['语文', '数学', '英语', 'python']
df = DataFrame(data=data, index=index, columns=columns)
df
语文数学英语python
张三778214738
李四29411118
王五761441064
赵六3782140129
# 使用行索引与列索引修改DataFrame数据
df.loc['张三', '数学'] = np.nan
df.loc['王五', '英语'] = None
df # 可以看到None也显示为nan
语文数学英语python
张三77NaN147.038
李四2941.011.018
王五76144.0NaN4
赵六3782.0140.0129
# pandas中nan也看成是numpy的浮点类型
type(df.loc['张三', '数学'] ) # numpy.float64;  

pandas中对数据进行数学运算时,会自动跳过 NaN 值,以避免对计算结果产生影响

df.sum()
"""
语文        219.0
数学        267.0
英语        298.0
python    189.0
dtype: float64
"""

df.mean() # 求平均数
"""
语文        54.750000
数学        89.000000
英语        99.333333
python    47.250000
dtype: float64
"""

pandas中None与np.nan的操作

1.判断nan函数
  • isnull()
  • notnull()
# 会判断每一个元素是否是None, 如果是None就会返回True
df.isnull()

df.notnull() # 与isnull()相反;不是None就会返回True
语文数学英语python
张三TrueFalseTrueTrue
李四TrueTrueTrueTrue
王五TrueTrueFalseTrue
赵六TrueTrueTrueTrue
# axis=0, 对行进行聚合, 行消失了, 留下了列, 所以最终的效果是查看每一列是否存在缺失值, 
df.isnull().any(axis=0)

"""
语文        False
数学         True
英语         True
python    False
dtype: bool
"""
# axis=1, 表示对列进行聚合, 列没了. 留下了行, 最终的效果是对每一行判断是否有缺失数据. 
df.isnull().any(axis=1)

"""
张三     True
李四    False
王五     True
赵六    False
dtype: bool
"""
2.过滤函数dropna()
  • axis:指定删除行还是列。默认为 0,表示删除包含缺失值的行;如果设置为 1,表示删除包含缺失值的列。
  • how:指定删除行或列的条件。可选取值为 ‘any’ 或 ‘all’。‘any’ 表示只要存在一个缺失值就删除该行或列,‘all’ 表示全部为缺失值才删除。
  • thresh:设置一个阈值,如果某行或列的非缺失值数量低于该阈值,则删除该行或列。
  • subset:指定在哪些列或行中查找缺失值并删除。可以传入列名或行索引。
  • inplace:是否在原数据上进行修改。默认为 False,表示返回一个新的 DataFrame;如果设置为 True,表示在原 DataFrame 上进行修改,并返回 None。
  • ignore_index:是否重置索引。如果设置为 True,删除行或列后会重新设置索引,从 0 开始递增。

一般的删除数据/过滤数据的原则

  1. 缺的数据太多了. 比如缺了50% 以上.
  2. 缺的数据对我们要做的事情没有任何帮助. 相当于是无用数据. 也可以删掉.
df
语文数学英语python
张三77NaN147.038
李四2941.011.018
王五76144.0NaN4
赵六3782.0140.0129
# 单独的drop是删除指定的行或列
df.drop(index=['张三', '王五'])
语文数学英语python
李四2941.011.018
赵六3782.0140.0129
# 删除列;以下2种写法效果一致
df.drop(columns='数学')
df.drop(labels='数学', axis=1)
语文英语python
张三77147.038
李四2911.018
王五76NaN4
赵六37140.0129
df.dropna(axis=1) # 通过axis=1改成删除含有缺失数据的列
语文python
张三7738
李四2918
王五764
赵六37129
df_copy = df.copy() # 深拷贝一个副本
df_copy
语文数学英语python
张三77NaN147.038
李四2941.011.018
王五76144.0NaN4
赵六3782.0140.0129
df.dropna(how='any') # 行中有任意缺失数据,删除该行
语文数学英语python
李四2941.011.018
赵六3782.0140.0129
df.dropna(inplace=True) # 在原数据上进行修改; 删除存在nan的行数据
df
语文数学英语python
李四2941.011.018
赵六3782.0140.0129
3.填充函数 fillna()
  • value:用于填充缺失值的标量值、字典、Series 或 DataFrame。可以是一个固定的值,也可以是根据特定条件填充的值。
  • method:指定填充缺失值的方法。常用取值包括:
    ‘ffill’ 或 ‘pad’:用缺失值前面的有效值进行填充。
    ‘bfill’ 或 ‘backfill’:用缺失值后面的有效值进行填充。
  • axis:指定填充的方向,0 表示按列填充,1 表示按行填充。
  • inplace:是否在原数据上进行修改。默认为 False,表示返回一个新的 DataFrame;如果设置为 True,表示在原 DataFrame 上进行修改,并返回 None。
  • limit:设定连续缺失值填充的最大数量。
  • downcast:用于指定数据类型的优化参数,可以选择 ‘infer’、‘integer’、‘signed’、‘unsigned’ 等。

一般填充方式: 可以选择平均数, 众数, 中位数,
拉格朗日插值法/机器学习算法根据规律预测的值去填.
通用原则: 合理, 尽量合理, 尽量贴近真实情况.
甚至可以用相邻的数据去填充.

df = df_copy
df
语文数学英语python
张三77NaN147.038
李四2941.011.018
王五76144.0NaN4
赵六3782.0140.0129
# 使用指定的值去填充. 
df.fillna(value=100)
语文数学英语python
张三77100.0147.038
李四2941.011.018
王五76144.0100.04
赵六3782.0140.0129
# 使用各科的平均成绩去填充张三的成绩. 
df_mean = df.mean()
df_mean
"""
语文        54.750000
数学        89.000000
英语        99.333333
python    47.250000
dtype: float64
"""

语文         77.0
数学         89.0
英语        147.0
python     38.0
Name: 张三, dtype: float64
# value直接传series, 会自动按照相同索引去填充. 
df.fillna(value=df_mean)
语文数学英语python
张三7789.0147.00000038
李四2941.011.00000018
王五76144.099.3333334
赵六3782.0140.000000129
# axis=1按照前一列有效值:前向填充
df.fillna(method='ffill', axis=1)
语文数学英语python
张三77.077.0147.038.0
李四29.041.011.018.0
王五76.0144.0144.04.0
赵六37.082.0140.0129.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值