Python中的None
None是Python自带的,其类型为python object 。因此,None不能参与到任何计算中。
type ( None )
np.nan(NaN)
np.nan是浮点类型,能参与到计算中。但计算的结果总是NaN。
但可以使用np.nan*()函数来计算nan,此时视nan为0。
import numpy as np
type ( np. nan)
np. nan + 1
np. nansum( np. array( [ 1 , 2 , 3 , np. nan] ) )
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 张三 77 82 147 38 李四 29 41 11 18 王五 76 144 106 4 赵六 37 82 140 129
df. loc[ '张三' , '数学' ] = np. nan
df. loc[ '王五' , '英语' ] = None
df
语文 数学 英语 python 张三 77 NaN 147.0 38 李四 29 41.0 11.0 18 王五 76 144.0 NaN 4 赵六 37 82.0 140.0 129
type ( df. loc[ '张三' , '数学' ] )
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函数
df. isnull( )
df. notnull( )
语文 数学 英语 python 张三 True False True True 李四 True True True True 王五 True True False True 赵六 True True True True
df. isnull( ) . any ( axis= 0 )
"""
语文 False
数学 True
英语 True
python False
dtype: bool
"""
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 开始递增。
一般的删除数据/过滤数据的原则
缺的数据太多了. 比如缺了50% 以上. 缺的数据对我们要做的事情没有任何帮助. 相当于是无用数据. 也可以删掉.
df
语文 数学 英语 python 张三 77 NaN 147.0 38 李四 29 41.0 11.0 18 王五 76 144.0 NaN 4 赵六 37 82.0 140.0 129
df. drop( index= [ '张三' , '王五' ] )
语文 数学 英语 python 李四 29 41.0 11.0 18 赵六 37 82.0 140.0 129
df. drop( columns= '数学' )
df. drop( labels= '数学' , axis= 1 )
语文 英语 python 张三 77 147.0 38 李四 29 11.0 18 王五 76 NaN 4 赵六 37 140.0 129
df. dropna( axis= 1 )
语文 python 张三 77 38 李四 29 18 王五 76 4 赵六 37 129
df_copy = df. copy( )
df_copy
语文 数学 英语 python 张三 77 NaN 147.0 38 李四 29 41.0 11.0 18 王五 76 144.0 NaN 4 赵六 37 82.0 140.0 129
df. dropna( how= 'any' )
语文 数学 英语 python 李四 29 41.0 11.0 18 赵六 37 82.0 140.0 129
df. dropna( inplace= True )
df
语文 数学 英语 python 李四 29 41.0 11.0 18 赵六 37 82.0 140.0 129
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 张三 77 NaN 147.0 38 李四 29 41.0 11.0 18 王五 76 144.0 NaN 4 赵六 37 82.0 140.0 129
df. fillna( value= 100 )
语文 数学 英语 python 张三 77 100.0 147.0 38 李四 29 41.0 11.0 18 王五 76 144.0 100.0 4 赵六 37 82.0 140.0 129
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
df. fillna( value= df_mean)
语文 数学 英语 python 张三 77 89.0 147.000000 38 李四 29 41.0 11.000000 18 王五 76 144.0 99.333333 4 赵六 37 82.0 140.000000 129
df. fillna( method= 'ffill' , axis= 1 )
语文 数学 英语 python 张三 77.0 77.0 147.0 38.0 李四 29.0 41.0 11.0 18.0 王五 76.0 144.0 144.0 4.0 赵六 37.0 82.0 140.0 129.0