DataFrame缺失值操作
创建测试数据集
- import pandas as pd
- import numpy as np
- data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],
- 'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],
- 'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],
- 'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']}
- labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
- df2 = pd.DataFrame(data, index=labels)
- df2
复制代码
一、缺失值填充
函数DataFrame.fillna()
参数value:可以为数值、字典、Series、DataFrame
参数method:方法,可以为backfill、bfill、pad、ffill、None,默认None。
backfill/bfill:用下一个非缺失值去填充该缺失值。pad/ffill:用前一个非缺失值填充该缺失值。None:指定一个缺失值来填充
参数inplace:默认False,如果为True,就地填充。True:直接修改原对象;False:创建一个副本,修改副本,原对象不变。
参数limit:指定每列或每行替换NaN元素的个数。
参数axis:0/index、1/columns。0/index:按行填充;1/columns:按列填充。
1.1、用数值填充空值,并不修改原对象。下图中原始数据集df3未发生变化,存在空值,副本df4空值都被指定数值替换。
- df3 = df2.copy()
- df4 = df3.fillna(value=3,inplace=False)
- print(df3)
- df4
复制代码
1.2、用数值填充空值,并修改原对象。下图中原始数据集df3被指定数值替换。
- df3 = df2.copy()
- print(df3)
- df3.fillna(value=3,inplace=True)
- df3
复制代码
1.3、用字典填充
- df3 = df2.copy()
- df3.fillna(value={'age':3},inplace=True)
- df3
复制代码
1.4、backfill/bfill:用下一个非缺失值去填充该缺失值
- df3 = df2.copy()
- print(df3)
- df3.fillna(method='bfill',inplace=True)
- df3
复制代码
1.5、pad/ffill:用前一个非缺失值填充该缺失值
- df3 = df2.copy()
- print(df3)
- df3.fillna(method='pad',inplace=True)
- df3
复制代码
1.6、指定limit参数值,下面是按行替换2个NaN值
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
- df3.fillna(value=9,limit=2)
复制代码
1.7、axis参数设置,axis=1:按列填充数值,如method='ffill',axis=1,则空值由它前一列的非空值填充。
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
- df3.fillna(method='ffill',axis=1)
复制代码
二、缺失值删除
函数dropna()
参数how:可为any、all,默认any
参数thresh:需要的非空值数量。
参数suset:定义搜索的行列标签,删除空值所在的行或列
参数axis:0/index、1/columns。0/index:按行填充;1/columns:按列填充。
2.1、删除含有空值的列
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
复制代码
2.2、how='any':删除存在缺失的行数
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
- df3.dropna(how='any')
复制代码
2.3、删除全为空值的列
how='all',axis=1
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
- df3.dropna(how='all',axis=1)
复制代码
2.4、将行数中少于4个非空数值的行删除
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
- df3.dropna(thresh=4,inplace=True)
- df3
复制代码
2.5 指定某列的搜索非空值的行保留
- df3 = df2.copy()
- df3.loc[0:3,'visits']=np.nan
- df3.loc[:,'c']=np.nan
- print(df3)
- df3.dropna(subset=['visits'] ,inplace=True)
- df3
复制代码
|