本章节主要包含两个内容:1.缺失数据处理;2.重复数据处理;3. 数据替换和轴标签重命名;4.离散化-面元划分;5.异常值检测;6.排列和随机采样;7.字符串处理。
1.缺失数据处理
- )在pandas中,缺失数据以浮点值NaN表示,可以利用函数
data.isnull()
来判断,返回值为布尔型; - )滤除缺失数据:
data.dropna( ) # == data[data.notnull( )]
;
dropna()
默认丢弃任何含有缺失值的行;
dropna(how='all')
只丢弃全为NA 的行;
dropna(axis=1,how='all')
丢弃全为NA的列;(axis=1意味:丢弃列索引及其数值)
dropna(thresh = n)
丢弃NA值后,剩余参数的数量<n,则丢弃此行。 - )缺失数据填充:
fillna( )
;即替换数组中的NA值,默认返回 新对象
(1)data2=data.fillna(0) #以 0 填充替换NA值;
(2)data.fillna(0,inplace=True)
# 就地修改,原数组的NA值也被替换;
(3)利用字典填充对应列的NA值:
data.fillna({1:0.5,2:1})
# 数组第二列的NA值用0.5代替;第三列NA值用1代替;
(4)data.fillna(method='ffill',limit=2)
# 'ffill’前值填充,只填充前2个出现的NA值;
(5)data.fillna(data.mean())
# 均值填充,(此处均值为非NA值统计得到的均值)。
2.重复数据处理
- )重复数据的判断:
data.duplicated()
#每行返回布尔型,判断是否存在重复行; - ) 重复数据的移除:
data.drop_duplicated()
# 去掉重复行,返回移除后的数组,默认保留的为重复行中第一个出现的行;
data.drop_duplicated(['k1','k2'], keep='last')
# 依据k1、k2列来判断重复行,并删除,保留重复行中最后出现的行;
3 数据和轴标签替换
- )
data.replace(-999,np.nan)
# 数据单个替换,-999的值全部替换为NaN,无效值; - )多个值替换:
data.replcae([-999,1000],[np.nan,0])
;
data.replace({-999:np.nan,1000:0})
# 针对不同的值,替换为特定值; - )轴标签替换:
(1)标签直接命名:data.index=[]; data.columns=[];
(2)rename函数:data.rename(index = str.title,columns = str.upper)
# 行标签更改为标题格式;列标签更改为大写格式;
data.rename(index={'a':'1'},columns={'three':'3'},inplace=True)
# 行索引‘a’更改为数字1,‘three’更改为数字3,在原数组上修改。
4 离散化-面元划分(数据规整)
- )cut函数:
先定义面元,bins=[18,30,50,80,100]
再进行面元划分和区间判断,cats=pd.cut(ages,bins,right=False)
划分的区间为[ ),开闭区间通过right
参数设置;输出ages中,各参数所属的面元区间[ , );
(1)pd.value_count(cats)
是pd.cut( )
在各面元中各计数的结果;
(2)cats.code
输出ages中各元素所属面元,以0,1,2……代表各bins面元区间的序号;
(3)给各面元区间添加标签:pd.cut(ages,bins,labels=['a','b','c','d'])
,以变量 a,b,c,d命名四个区间,并输出ages中各面元所属区间的标签;
(4)针对数据分割一定个数的等长区间:pd.cut(data,4,precision=2)
,表示以data的最大最小值分割等长的4个区间,且精确到2位小数,返回data中每个数所属面元。 - )qcut函数:
(1)依据样本分位数进行面元划分,得到样本数量基本相等的面元;cats=pd.qcut(data,4)
# 按4 分位数划分样本数据data。(与cut函数不同)
(2) 可以自定义面元区间:pd.qcut(data,[0,0,1,0.5,0.8,1])
.
5 异常值检测过滤
- )在dataframe数组中,寻找一定条件的行:
col=data[2]
# data的第三列;
col[np.abs(col) > 3]
# 判断第二列中,绝对值大于3的行,并返回行序号和数值(col);
data[np.abs(col) > 3]
# 判断第二列中,绝对值大于3的行,并返回此行的缩影元素(data);
6 排列和随机采样
-
)随机重排:
(1)order=np.random.permutation(df.index)
; 随机排列数组的行索引
(2)利用iloc( )
函数、take( )
函数,对行、列重排:
df.take(order,axis=0)
,行重排; df.take(order,axis =1) ,列重排
df.iloc(order,:)
,行重排 df.iloc(:,order),列重排 -
)随机采样:
(1)df.sample(n=3)
随机选取数据,形成随机子集。
7 字符串处理
- )字符串拆分:
split( )
data.split(',')
# 依据逗号分隔字符串,且去掉逗号; - )去除空白符:
strip( )
new=[x.strip( ) for x in data.split(',')]
# 在字符串拆分的基础上,去掉各拆分字符内的空白符; - )利用::连接多个字符串
'::'.join(pie)
# 以符号 ‘::’ 连接pie中的字符串
':'.join(pie)
。 - )字符串定位
(1)'b' in data
# 返回布尔型数值,是否包含字符‘b’;
(2)data.index(',')
# 返回值为1,则包含字符串;不包含,报错;
(3)data.find('')
# 返回值为1和-1,分别代表包含和不包含; - )字符串次数统计
data.count(',')
# 统计‘,’的出现次数 - )字符替换
data.replace(',',':')
# 以 ‘:’ 替换字符串中的 ‘,’;
还可以用空白代替字符,实现删除:
data.replace(',','')
# 删除