赞
踩
对于表格数据而言,缺失值分为三种:
Pandas中的空值有三个:np.nan (Not a Number) 、 None 和 pd.NaT(时间格式的空值,注意大小写不能错),这三个值可以用Pandas中的函数isnull(),notnull(),isna()进行判断。
isnull()和notnull()的结果互为取反,isnull()和isna()的结果一样。
需要特别注意三点:
- 如果某一列数据全是空值且包含pd.NaT,np.nan和None会自动转换成pd.NaT。
- 空值(np.nan、None、pd.NaT)既不是空字符串"“,也不是空格” "。
- None是 一个 Python 对象
不可以用在任意的 NumPy 或 Pandas 数组里,只用于列表且数据类型是 Object。
默认 Pandas 会将 None 转换成 NAN
对包含 None 元素的数组进行计算(如: sum, min, max)会抛出 TypeError 异常。
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.nan],
'int': [1,8,None],
'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,pd.NaT],
'string': ['python','pandas','numpy']})
例如通过df.isnull()查看缺失情况。
对于特别大的数字,或者除数为0时,将产生正负无穷,Pandas中用np.inf表示。
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.nan],
'int': [1,8,None],
'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,pd.NaT],
'string': ['python','pandas','numpy']})
df['inf'] = df['float']/0
自定义缺失值有很多不同的形式,如上面刚说的空字符串和空格(当然,一般不用这两个,因为看起来不够直观)。
在获取数据时,可能会有一些数据无法得到,也可能数据本身就没有,造成了缺失值。对于这些缺失值,在获取数据时通常会用一些符号之类的数据来代替,如问号?,斜杠/,字母NA等。
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.nan],
'int': [1,8,None],
'datetime': [pd.Timestamp('2018-03-10'),
pd.Timestamp('2019-05-10'),pd.NaT],
'string': ['python','pandas','numpy']})
df[~df.isin([np.nan, np.inf, -np.inf]).any(axis=1)]
import pandas as pd import numpy as np df = pd.DataFrame({'float': [1.3,5.2,np.inf], 'int': [1,8,None], 'datetime': [pd.Timestamp('2018-03-10'),pd.NaT, pd.Timestamp('2019-05-10')], 'string': ['python','pandas','numpy']}) df df['inf'] = df['float']/0 df df['inf'].replace(np.inf, 0, inplace=True) df df[df.replace([np.inf, -np.inf], np.nan).notnull().all(axis=1)] #df[df.notnull().all(axis=1)]
pandas中的dataframe对象,删除缺失值的方式:
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.inf],
'int': [1,8,None],
'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,
pd.Timestamp('2019-05-10')],
'string': ['python','pandas','numpy']})
df['inf'] = df['float']/0
df
df.dropna(axis=1).head(3)
df.replace([np.inf, -np.inf], np.nan).dropna(axis=1).head(3)
或者:
import numpy as np
df['Col'][np.isinf(df['Col'])] = -1
import numpy as np
df['Col'][np.isinf(df['Col'])] = np.nan
填充缺失值:
例如:
import pandas as pd import numpy as np df = pd.DataFrame({'A':[1,np.nan], 'B':[21,3], 'C':[4,5]}) #制造inf df['D'] = df['C']/0 print(df) #替换正inf为NaN df.replace(np.inf, np.nan, inplace=True) df['E'] = -df['B']/0 print(df) #替换正、负inf为0 df.replace([np.inf, -np.inf], 0, inplace=True) #单列替换NaN为10 df['A'].fillna(10, inplace=True) #替换NaN为0 df.replace(np.nan, 0, inplace=True) print(df)
isnull和notnull: 检测是否是空值,可用于dataframe和Series
dropna: 丢弃,删除缺失值
fillna: 填充空值
replace: 替换,replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。
参考:
[1]. wumingxiaoyao. Python 玩转数据 18 - Pandas 数据清洗 处理缺失值 None NA NaN inf dropna fillna isin isnull. CSDN博客. 2022.04
[2]. data_amateur. Python pandas中缺失值的种类(None、NA、NaN)及删除方式. CSDN博客. 2020.07
[3]. adam_hong. pandas 处理inf. 简书. 2021.10
[4]. 小斌哥ge. Pandas知识点-缺失值处理. 知乎. 2021.05
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。