1.缺失数据情况:一种为nan,一种为0
2缺失数据处理
2-1pd.isnull(df)可以找出值为nan数据,同理notnull找出不是nan的数据
import pandas as pdimport numpy as npt1=pd.DataFrame(np.arange(12).reshape((3,4)))#将(1,1)与(2,1)位置数据设置为nant1.iloc[[1,2],[1]]=np.nanprint(t1)print("*"*50)#判断数据是否是nana=pd.isnull(t1)print(a)print("*"*50)
运行结果:
D:pythonpython.exe F:/data_analysis/pandas9_dataframe_lack_data.py 0 1 2 30 0 1.0 2 31 4 NaN 6 72 8 NaN 10 11************************************************** 0 1 2 30 False False False False1 False True False False2 False True False False**************************************************进程已结束,退出代码 0
2-1打印出列不含nan所在行的数据
import pandas as pdimport numpy as npt1=pd.DataFrame(np.arange(12).reshape((3,4)))#将(1,1)与(2,1)位置数据设置为nant1.iloc[[1,2],[1]]=np.nanprint(t1)print("*"*50)#判断数据是否是nana=pd.isnull(t1)print(a)print("*"*50)#显示第2列中非nan的行数据-布尔索引print(t1[pd.notnull(t1[1])])print("*"*50)
运行结果:
D:pythonpython.exe F:/data_analysis/pandas9_dataframe_lack_data.py 0 1 2 30 0 1.0 2 31 4 NaN 6 72 8 NaN 10 11************************************************** 0 1 2 30 False False False False1 False True False False2 False True False False************************************************** 0 1 2 30 0 1.0 2 3**************************************************进程已结束,退出代码 0
2-3删除nan所在行列的数据,how默认的是any,any表示不全为nan的那一行/列删除,当为all的话,只删除全为nan的行/列。inplace替换的意思,为False时,不保留当前修改后的df,当为True时,保留修改后的df。
import pandas as pdimport numpy as npt1=pd.DataFrame(np.arange(12).reshape((3,4)))#将(1,1)与(2,1)位置数据设置为nant1.iloc[[1,2],[1]]=np.nanprint(t1)print("*"*50)#判断数据是否是nan# a=pd.isnull(t1)# print(a)# print("*"*50)#显示第2列中非nan的行数据-布尔索引# print(t1[pd.notnull(t1[1])])# print("*"*50)#删除nan所在的行,想删除列的话,把axis的值调为1print(t1.dropna(axis=0))print("*"*50)
运行结果:
D:pythonpython.exe F:/data_analysis/pandas9_dataframe_lack_data.py 0 1 2 30 0 1.0 2 31 4 NaN 6 72 8 NaN 10 11************************************************** 0 1 2 30 0 1.0 2 3**************************************************进程已结束,退出代码 0
2-4替换nan,pd.fillna(10),将所有nan的值替换成10,但这样没有意义,pd.fillna(df.mean())把每列的nan填充为所在列的均值。如果想替换某一列的nan,也可以用df[""]pd.fillna()
2-4-1替换nan的值为10
import pandas as pdimport numpy as npt1=pd.DataFrame(np.arange(12).reshape((3,4)))#将(1,1)与(2,1)位置数据设置为nant1.iloc[[1,2],[1]]=np.nanprint(t1)print("*"*50)#替换nan的值为10print(t1.fillna(10))print("*"*50)
运行结果:
D:pythonpython.exe F:/data_analysis/test.py 0 1 2 30 0 1.0 2 31 4 NaN 6 72 8 NaN 10 11************************************************** 0 1 2 30 0 1.0 2 31 4 10.0 6 72 8 10.0 10 11**************************************************进程已结束,退出代码 0
2-4-2替换nan的值为均值
import pandas as pdimport numpy as npt1=pd.DataFrame(np.arange(12).reshape((3,4)))#将(1,1)与(2,1)位置数据设置为nant1.iloc[[1,2],[1]]=np.nanprint(t1)print("*"*50)#替换nan的值为10print(t1.fillna(10))print("*"*50)#替换nan的值为均值print(t1.fillna(t1.mean()))
运行结果:
D:pythonpython.exe F:/data_analysis/test.py 0 1 2 30 0 1.0 2 31 4 NaN 6 72 8 NaN 10 11************************************************** 0 1 2 30 0 1.0 2 31 4 10.0 6 72 8 10.0 10 11************************************************** 0 1 2 30 0 1.0 2 31 4 1.0 6 72 8 1.0 10 11进程已结束,退出代码 0
2-4-3把某一列含nan的替换成均值,含有nan的列df.mean()方法比series里方法求平均值简单多了,直接调用mean方法即可,nan是不参与运算的
import pandas as pdimport numpy as npt1=pd.DataFrame(np.arange(12).reshape((3,4)))#将(1,1)与(2,1)位置数据设置为nant1.iloc[[1],[1,2]]=np.nanprint(t1)print("*"*50)#替换nan的值为10print(t1.fillna(10))print("*"*50)#替换nan的值为均值#print(t1.fillna(t1.mean()))#替换第2列nan的值为均值print(t1.iloc[:,1].fillna(t1.mean()))
运行结果:
D:pythonpython.exe F:/data_analysis/test.py 0 1 2 30 0 1.0 2.0 31 4 NaN NaN 72 8 9.0 10.0 11************************************************** 0 1 2 30 0 1.0 2.0 31 4 10.0 10.0 72 8 9.0 10.0 11**************************************************0 1.01 5.02 9.0Name: 1, dtype: float64进程已结束,退出代码 0
2-5对于值为0的情况,可以先将其转换为nan,对nan的处理方式如上所示