pandas数据预处理

import pandas as pd
import numpy as np

数据预处理的四种技术:数据合并,数据清洗,数据标准化,数据转换。

一 合并数据

1 堆叠数据

横向堆叠


使用方法:
***pd.concat(objs,join=‘outer’, join_axes=None,ignore_index=False, keys=None, levels=None, names=None, verify_interity=False, copy=True)***

参数说明
objs接受用于合并的series,dataframe的组合。以列表的形式
axis表示堆叠的轴向,默认axis为0,表示纵向堆叠
join接受inner或outer。表示其他轴向上的索引是按交集还是并集进行合并,默认为outer
ignore_index接受boolean.表示是否不保留连接轴上的索引,产生一组新索引range(toatal_length)默认为False
verify_intergrity接受boolean,检查新连接的轴是否包含重复项。如果发现重复项,则引发异常。默认为False
data1 = pd.DataFrame(np.random.rand(3,3),index = list('abc'),columns = list('ABC'))  # dataframe1
data1
ABC
a0.5824170.1020530.021993
b0.0527300.5432210.174459
c0.5738400.9096380.048835
data2 = pd.DataFrame(np.random.rand(2,2),index = list('ad'),columns = list('AD'))  # dataframe2
data2
AD
a0.4277350.142095
d0.1214310.563111
# 横向合并数据 
pd.concat([data1,data2],axis = 1, join = 'outer',ignore_index=False)  # 其他轴向上的索引为并集。
ABCAD
a0.5824170.1020530.0219930.4277350.142095
b0.0527300.5432210.174459NaNNaN
c0.5738400.9096380.048835NaNNaN
dNaNNaNNaN0.1214310.563111
pd.concat([data1,data2],axis = 1, join = 'inner',ignore_index=False)   # 其他轴向的索引为交集。
ABCAD
a0.5824170.1020530.0219930.4277350.142095
纵向堆叠
# 纵向堆叠,其他轴向的为并集
pd.concat([data1,data2],axis = 0,join='outer',ignore_index=False)
ABCD
a0.5824170.1020530.021993NaN
b0.0527300.5432210.174459NaN
c0.5738400.9096380.048835NaN
a0.427735NaNNaN0.142095
d0.121431NaNNaN0.563111
pd.concat([data1,data2], axis =0, join = 'inner',ignore_index=False)  # 交集
A
a0.582417
b0.052730
c0.573840
a0.427735
d0.121431

除了concat方法之外,append方法也可以实现纵向堆叠。但是前提是,带合并的两张表的列名要一致,如若不然,则会报错。

data1.append(data2,ignore_index=False)   
ABCD
a0.5824170.1020530.021993NaN
b0.0527300.5432210.174459NaN
c0.5738400.9096380.048835NaN
a0.427735NaNNaN0.142095
d0.121431NaNNaN0.563111

2 主键合并数据

主键合并就是通过一个或者多个键将两个数据集的行连接起来。类似于sql中的join。

merge方法

***pd.merge(left,right,how,on,left_on,right_on,left_index,right_index,sort,suffixes)***

参数说明
left接受dataframe或者series。表示要添加的新数据。没有默认
right接受dataframe或者series。表示要添加的数据,没有默认
how接受inner,outer,left,right。表示数据的连接方式。默认为inner
on表示两个数据合并的主键(必须一致)。默认为None
right_on接受string或者sequence.表示right参数接收数据用于合并的主键。默认为None
left_on接受string或者sequence.表示left参数接收数据用于合并的主键。默认为None
left_index接受True or False。表示是否将left参数数据的index(行索引)作为连接主键。默认为None
right_index接受True or False。表示是否将right参数数据的index(行索引)作为连接主键。默认为None
sort接受boolean。表示是否根据连接键对合并后的数据进行降序。默认为False
suffixes接受tupple。表示用于追加到left和right参数接受数据列明相同时的后缀。默认为(’_x’,’_y’)


主键合并的三种情况:

1 左右数据有共同的列名,用共同的列名作为主键。此时使用on参数,传入共同的列名。合并后的数据列数为原来数据的列数和减去连接键的数量

2 使用不同列名主键进行合并

3 赋予left_index和right_index参数。使用原本数据的index(行索引)作为主键进行合并

data_1 = pd.DataFrame({'key1':list('aavde'),'key2':list('asdfs'),'key3':list(str(12345))})   # int数据不是可迭代类型数据
data_1
key1key2key3
0aa1
1as2
2vd3
3df4
4es5
data_2 = pd.DataFrame({'key2':list('aiopd'),'key3':list('33333')})
data_2
key2key3
0a3
1i3
2o3
3p3
4d3

用共同的列名作为主键

pd.merge(data_1,data_2,on = 'key2',how = 'inner')   # 此时data_1与data_2的共同列名为key2.将其传给on。作为合并主键。 进行交集合并
key1key2key3_xkey3_y
0aa13
1vd33
pd.merge(data_1,data_2,on = 'key2',how = 'outer')  # 进行并集合并
key1key2key3_xkey3_y
0aa13
1as2NaN
2es5NaN
3vd33
4df4NaN
5NaNiNaN3
6NaNoNaN3
7NaNpNaN3
pd.merge(data_1,data_2,on = 'key2',how = 'left')  # 进行左合并 就是以左边数据主键下对应的数据为基准 key2 = data_1.key2
key1key2key3_xkey3_y
0aa13
1as2NaN
2vd33
3df4NaN
4es5NaN
pd.merge(data_1,data_2,on = 'key2',how = 'right')  # 右合并,就是以右边的数据主键下对应额数据为基准。key2 = data_2.key2
key1key2key3_xkey3_y
0aa13
1vd33
2NaNiNaN3
3NaNoNaN3
4NaNpNaN3

因为data_1与data_2除了相同的key2列名外,还有相同的列名key3。因此合并后的数据相同的要以区分开来。此时就可以通过suffixes设置

pd.merge(data_1,data_2,on = 'key2',how = 'inner',suffixes=('_data_1','_data_2 ')) # 
key1key2key3_data_1key3_data_2
0aa13
1vd33

用不同的列名作为主键

pd.merge(data_1,data_2,how = 'inner',left_on = 'key1',right_on = 'key2') # 左右的合并主键分别是key1和key2。
key1key2_xkey3_xkey2_ykey3_y
0aa1a3
1as2a3
2df4d3

用索引作为主键

data_1
key1key2key3
0aa1
1as2
2vd3
3df4
4es5
data_2
key2key3
0a3
1i3
2o3
3p3
4d3
pd.merge(data_1,data_2,how = 'inner',left_index = True,right_index=True)
key1key2_xkey3_xkey2_ykey3_y
0aa1a3
1as2i3
2vd3o3
3df4p3
4es5d3

image.png

data_1与data_2是两个数据集的索引作为主键进行合并的。

join方法

使用join方法时,两个主键的名字必须相同。

***dataframe.join(self,other,on=None,how=‘left’,lsuffix=’’,resuffix=’’,sort=False)***

参数说明
other接收dataframe或者series或者list.表示参与连接的其他dataframe
on接收列名或者包含列名的List,tuple。表示用于连接的列名。默认为None
how接收 inner outer left right,默认为inner
lsuffix接受string,表示用于追加到左侧重叠列名的尾缀,无默认
rsuffix接受string,表示用于追加到右侧重叠列名的尾缀,无默认
sort接受boolean,根据连接键对合并后的数据进行排序
data_1.join(data_2,on = 'key2',lsuffix=' ',rsuffix=' ')
key1key2key3key2key3
0aa1NaNNaN
1as2NaNNaN
2vd3NaNNaN
3df4NaNNaN
4es5NaNNaN
data_1
key1key2key3
0aa1
1as2
2vd3
3df4
4es5
data_2
key2key3
0a3
1i3
2o3
3p3
4d3

3 重叠合并数据

此处的数据合并比较类似于字典中的updata方法。用一个dataframe来更新弥补另一个dataframe中相同位置处的缺失值。

***dataframe.combine_first(other)***

data_t = pd.DataFrame([[np.nan,3,5],[np.nan,4.6,np.nan],[np.nan,7,np.nan]],index = [0,1,2],columns=[0,1,2]) # 1
data_t
012
0NaN3.05.0
1NaN4.6NaN
2NaN7.0NaN
data_e = pd.DataFrame([[42,np.nan,8.2],[10,7.0,4.0]])
data_e
012
042NaN8.2
1107.04.0
data_t.combine_first(data_e)
012
042.03.05.0
110.04.64.0
2NaN7.0NaN

二 清洗数据

检测与处理重复值


方法:
***dataframe.drop_duplicates(subset=None,keep=‘first’,inplace=False)***

参数说明
subset接受string或sequence。表示去重的列。默认为None
keep表示保留第几个数据.first,last,false(表示一个不保留),默认为first
inplace接受boolean,表示是否在原表上进行操作,默认为False
data_repeat = pd.DataFrame({'key1':list('aabcdde'),'key2':[1,1,2,3,4,4,5]})
data_repeat
key1key2
0a1
1a1
2b2
3c3
4d4
5d4
6e5
data_repeat.drop_duplicates(subset='key2')
key1key2
0a1
2b2
3c3
4d4
6e5
data_repeat.drop_duplicates(subset=['key1','key2'])
key1key2
0a1
2b2
3c3
4d4
6e5

检测与处理缺失值

识别缺失值


pandas中提供isnull和notnull两种方法来检测是否存在缺失值。

isnull表示存在缺失值

notnull表示不存在缺失值

data_null = pd.DataFrame({'key1':[np.nan,1,2,3,4,5,np.nan],'key2':[1,2,3,4,5,6,np.nan]})
data_null
key1key2
0NaN1.0
11.02.0
22.03.0
33.04.0
44.05.0
55.06.0
6NaNNaN
data_null.isnull()   # 以true或者false来表示是否是缺失值。
key1key2
0TrueFalse
1FalseFalse
2FalseFalse
3FalseFalse
4FalseFalse
5FalseFalse
6TrueTrue
data_null.isnull().sum()   # 统计一下缺失值数目
key1    2
key2    1
dtype: int64

处理缺失值

处理缺失值的方法主要有:删除法,替换法,插值法。

删除法

***dataframe.dropna(axis = 0,how = ‘any’,thresh=None,subset=None,inplace = None)***

参数说明
how表示删除的形式,any:只有存在缺失值就删除,all:全部为缺失值才删除
thresh接受int数据,表示容忍非缺失值的数据个数
subset接受array,表示进行去重的列/行。默认为None
inplace
data_null
key1key2
0NaN1.0
11.02.0
22.03.0
33.04.0
44.05.0
55.06.0
6NaNNaN
data_null.dropna(axis = 0,how = 'any',subset=['key1','key2'])   # 原数据集中,key1与key2列中只要存在缺失值,则就删除对应的行。
key1key2
11.02.0
22.03.0
33.04.0
44.05.0
55.06.0
data_null.dropna(axis = 0,how = 'all',subset=['key1','key2']) # 原数据集中,key1与key2列中都为缺失值,才会删除。
key1key2
0NaN1.0
11.02.0
22.03.0
33.04.0
44.05.0
55.06.0
data_null['key3'] = [1,2,3,4,6,7,8]
data_null
key1key2key3
0NaN1.01
11.02.02
22.03.03
33.04.04
44.05.06
55.06.07
6NaNNaN8
data_null.dropna(thresh=1)    # thresh 表示能够容忍生下来的非缺失值的个数。thresh表示当某一行中,只要存在1个非缺失值,就不必要删除。
key1key2key3
0NaN1.01
11.02.02
22.03.03
33.04.04
44.05.06
55.06.07
6NaNNaN8
data_null.dropna(thresh=2)
key1key2key3
0NaN1.01
11.02.02
22.03.03
33.04.04
44.05.06
55.06.07
data_null.dropna(thresh=3)
key1key2key3
11.02.02
22.03.03
33.04.04
44.05.06
55.06.07

替换法

***dataframe.fillna(value = None,method=None,axis=None,inpalce=False,limit=None)***

参数说明
value接受dict,series,dataframe。表示用来替换缺失值。无默认
method接受特定string,backfill或者bfill表示使用下一个 非缺失值来填补缺失值。pad或者ffill表示使用上一个非缺失值来填补
data_null
key1key2key3
0NaN1.01
11.02.02
22.03.03
33.04.04
44.05.06
55.06.07
6NaNNaN8
data_null.fillna(111)
key1key2key3
0111.01.01
11.02.02
22.03.03
33.04.04
44.05.06
55.06.07
6111.0111.08

插值法(待补充)

检测与处理异常值

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值