1.识别缺失值
函数:df.isnull()
结合其他方法:
df.isnull().sum() #找出缺失值数量
df.isnull().sum()/len(df) #找出占比
dit={'col1':[0,1,2,None,4],'col2':[5,None,6,7,None]}
df=pd.Dataframe(dit)
df.isnull().sum()
>
col1 1
col2 2
dtype: int64
df.isnull().sum()/len(df)
>
col1 0.2
col2 0.4
dtype: float64
2.处理缺失值
(1)删除法
函数:pandas.df.dropna
常用参数:
| axis | 表示删除的轴向,0为删除观测记录(行),1为删除特征(列)。默认为0. |
| how | ‘any’表示只要有缺失值存在就执行删除操作;‘all’表示当且仅当全部为缺失值时执行删除操作。 |
| subset | 表示进行删除缺失值的列,默认为所有列。 |
| inplace | bool,表示是否在原表上操作,默认为False。 |
df
>
col1 col2
0 0.0 5.0
1 1.0 NaN
2 2.0 6.0
3 NaN 7.0
4 4.0 NaN
df.dropna()
>
col1 col2
0 0.0 5.0
2 2.0 6.0
df.dropna(subset=['col1'])#只有当指定列为缺失时才删除整行
>
col1 col2
0 0.0 5.0
1 1.0 NaN
2 2.0 6.0
4 4.0 NaN
(2)替换法
缺失值可以分为数值型缺失值和类别型缺失值。
当缺失值为数值型时常用均值、中位数和众数等用来描述其集中趋势的统计量来替换。
当缺失值为类别型时常选择用众数来替换。
函数:df.fillna
常用参数:
| value | 接收数字、dict、Series、Dataframe,表示用来替换缺失值的值。 |
| method | 接收特定str,表示缺失值填补方法,当value值没有时才起效。 ‘backfill'或’bfill'表示用下一个非缺失值填补; 'pad'或'ffill'表示用上一个缺失值填补。 |
| axis | 0表示横轴,1表示纵轴。默认为1. |
| inplace | bool,是否在原表上操作。 |
| limit | int,表示填补缺失值个数的上限,超过则不进行填补。 |
df.fillna(0)#用0填补缺失值。
>
col1 col2
0 0.0 5.0
1 1.0 0.0
2 2.0 6.0
3 0.0 7.0
4 4.0 0.0
df.fillna(method='ffill')
>
col1 col2
0 0.0 5.0
1 1.0 5.0
2 2.0 6.0
3 2.0 7.0
4 4.0 7.0
df.fillna(value=np.mean(df))
>
col1 col2
0 0.00 5.0
1 1.00 6.0
2 2.00 6.0
3 1.75 7.0
4 4.00 6.0
(3)插值法
函数:df.interpolate
常用参数:
| method | str,表示插值方法,默认为‘linear’ |
| axis | int,0为横轴,1为纵轴。默认为0 |
| limit | int,遇到连续nan插值的最大数。默认为None。 |
| inplace | bool,表示是否在原表上操作。 |
插值方法:
| linear | 线性插值。忽视索引,将所有值看作是等间隔隔开。若为多重索引则只能用这种方法。 |
| time | 时间插值,索引为时间类型,按指定时间间隔插值。 |
| index,values | 索引插值,按照数值化的索引值来插值。 |
df.interpolate()
>
col1 col2
0 0.0 5.0
1 1.0 5.5
2 2.0 6.0
3 3.0 7.0
4 4.0 7.0
df1=df.set_index(pd.Index([0,1,2,8,9])
df1.interpolate(method='values')
>
col1 col2
0 0.000000 5.0
1 1.000000 5.5
2 2.000000 6.0
8 3.714286 7.0
9 4.000000 7.0
df2=df.set_index(pd.to_datetime(['2021-01-01','2021-01-02','2021-01-03','2021-01-08','2021-01-09']))
df2.interpolate(method='time')
>
col1 col2
2021-01-01 0.000000 5.0
2021-01-02 1.000000 5.5
2021-01-03 2.000000 6.0
2021-01-08 3.666667 7.0
2021-01-09 4.000000 7.0
二、重复数据处理
函数:df.drop_duplicates
常用参数:
| subset | 表示参与去重操作的列名。默认为全部列。 |
| keep | str,重复时保留第几个数据。 'first'指的是保留第一个; 'last'指的是保留最后一个; False表示只要有重复则一个都不保留。 默认为first。 |
| inplace |
df.drop_duplicates() df.drop_duplicates(subset=['col1'])三、连续特征离散化处理
即将数值型数据转化为类别型数据。
离散化有两个子任务:确定分类数;如何将连续型数据映射到这些离散的类别上。
1.等宽法
将数据的值域分为具有相同宽度的区间。
函数pd.cut()
常用参数:
| x | 数组或Series,表示需要进行离散化处理的数据。 |
| bins | int,list,array,tuple。 int:离散化后的类别数目。 list,array,tuple:进行切分的区间,每两个数间隔为一个区间 |
| right | bool,右侧是否为闭区间。默认为True。 |
| labels | list,array。离散化后各个类别的名称。 |
| retbins | bool,是否返回区间标签,默认为False。 |
| precision | int,显式的标签的精度。默认为3. |
series=pd.Series([1,6,7,8,9,15]) series1=pd.cut(series,bins=3) series > 0 1 1 6 2 7 3 8 4 9 5 15 dtype: int64 series1 > 0 (0.986, 5.667] 1 (5.667, 10.333] 2 (5.667, 10.333] 3 (5.667, 10.333] 4 (5.667, 10.333] 5 (10.333, 15.0] dtype: category Categories (3, interval[float64]): [(0.986, 5.667] < (5.667, 10.333] < (10.333, 15.0]] series.value_counts() #离散化后各区间内数据数目 > (5.667, 10.333] 4 (0.986, 5.667] 1 (10.333, 15.0] 1 dtype: int64
等宽法对数据分布具有较高的要求,如果数据分布不均匀那么等宽法得到的每个区间内数据的数目也会很不均匀。
2.等频法
将切分区间指定为被切分数据的分位数,这样能保证每个切分区间内数据的数目大致相等。
import numpy as np
def SameRateCut(data,k):
w=data.quantile(np.arange(0,1+1.0/k,1.0/k)) #注意np.arange(0,1+1.0/3,1.0/3)实际上为0,1/3,2/3,3/3.
data=pd.cut(data,w)
return data
series1=SameRateCut(series,3)
series1
>
0 NaN
1 (1.0, 6.667]
2 (6.667, 8.333]
3 (6.667, 8.333]
4 (8.333, 15.0]
5 (8.333, 15.0]
dtype: category
Categories (3, interval[float64]): [(1.0, 6.667] < (6.667, 8.333] < (8.333, 15.0]]
series1.value_counts()
>
(6.667, 8.333] 2
(8.333, 15.0] 2
(1.0, 6.667] 1
dtype: int64
等频法的缺陷是为了保证各区间数据数量差不多,很可能将距离很近的两个数据分到不同的区间。
四、哑变量处理哑变量又称为虚拟变量,通常取0或1.用于将类别型数据转化为数值型数据。
函数:pd.get_dummies()
常用参数:
| data | 用于哑变量处理的数据。 |
| prefix | 接收str,str的列表或str的dict。表示哑变量化后列名的前缀。 |
| prefix_sep | str,表示前缀的连接符。默认为下划线_ |
| dummy_na | bool,表示是否为nan值添加一列。默认为False。 |
| columns | 表示需要编码的列名。默认对所有数据。 |
| sparse | bool,表示虚拟列是否是稀疏的,默认为不是。 |
| drop_first | bool,表示是否通过将k个级别中删除第一个级别来获得k-1个级别,默认为False。 |
dit={'one':['tall','short','medium','tall','short'],'two':[1,3,5,2,7]}
df=pd.Dataframe(dit)
pd.get_dummies(df)
| two | one_medium | one_short | one_tall | |
|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 1 |
| 1 | 3 | 0 | 1 | 0 |
| 2 | 5 | 1 | 0 | 0 |
| 3 | 2 | 0 | 0 | 1 |
| 4 | 7 | 0 | 1 | 0 |



