数据规整化:清理、转换、合并、重整

1.合并数据集

(1)数据库风格的DataFrame合并

key:merge

通过一个或多个键将行连接起来:合并(merge)或连接(join)

pd.merge(df1,df2)#默认:重叠列的列名作为键

pd.merge(df1,df2,on='key')#显示指明

pd.merge(df3,df4,left_on='lkey',right_on='rkey')#左右列名不一样也可连接

pd.merge(df1,df2,how='outer')#连接方式有“inner”,"left“,”right“,”outer"。

pd.merge(df1,df2,on='key',how='left')#多对多,例左边有2个a,右边也有2个a,则产生4行,及产生笛卡尔积。

pd.merge(left,right,on=['key1','key2'],how='outer')#多个键合并

pd.merge(left,right,on='key1',suffixes=('_left','_right'))#重复列名制定附加,默认加_x,_y

(2)索引上的合并

key:merge,join

pd.merge(left1,right1,left_on='key',right_index=True)

pd.merge(lefth,righth,left_on=['key1','key2'],right_index=True,how='outer')#层次化索引

pd.merge(left2,right2,how='outer',left_index=True,right_index=True)#合并双方的索引

left2.join(right2,how='outer')#索引合并

left2.join(right2,on='key')#参数DataFrame和调用者的某列连接

left2.join([right2,another])#传入一组DataFrame

(3)轴向连接

key:concat

连接(concatenation),绑定(binding)或堆叠(stacking)

np.concatenate([arr,arr],axis=1)#列数变成之前的两倍

pd.concat([s1,s2,s3])#si是Series,默认axis=0。即行数增加

pd.concat([s1,s4],axis=1,join='inner')#交集

pd.concat([s1,s4],axis=1,join_axes=[['a','c','b','e']])#指定轴上使用索引

result=pd.concat([s1,s2,s3],keys=['one','two','three'])#创建层次化索引

pd.concat([s1,s2,s3],axis=1,keys=['one','two','three'])#按axis=1合并,keys变成列头

pd.concat({'level1':df1,'level2':df2},axis=1)#字典键变成keys选项

pd.concat([df1,df2],axis=1,keys=['level1','level2'],names=['upper','lower'])#给索引创建名字

pd.concat([df1,df2],ignore_index=True)#行索引不重要,索引重新排列

(4)合并重叠数据

key:combine_first

b[:-2].combine_first(a[2:])#数据对齐,在前者的基础上,把后者有且前者没有(包括Nan)的加上


2.重塑和轴向旋转

(1)重塑层次化索引

key:stack,unstack

data.stack()#将列的索引转为行,且转到内侧

result.unstack()#默认把内侧行索引,变到列索引的最内侧

result.unstack(0)/('state')#将指定行索引,变为列索引

unstack可能会引入缺失值,stack默认过滤到缺失值

data.unstack().stack(dropna=False)#不过滤缺失值

(2)将“长格式”旋转为“宽格式”

key:pivot

pivoted=ldata.pivot('data','item','value')#三个参数分别为行索引,列索引,填充值

pivoted=ldata.pivot('data','item')#忽略最后一个参数,则ldata除行索引和列索引的列都变成填充值


3.数据转换

(1)移除重复数据

key:drop_duplicates

data.duplicated()#返回F和T表示是不是重复

data.drop_duplicates()#移除重复行

data.drop_duplicates(['k1'])#指定列重复项判断,默认全部列判断

data.drop_duplicates(['k1','k2'],keep=Last)#默认保留第一个出现的值组合,现在改为保留最后一个

(2)利用函数或映射进行数据转换

key:map

data['animal']=data['food'].map(str.lower).map(meat_to_animal)#新加一列‘animal’,通过map映射,元素级映射

(3)替换值

key:replace

data.replace([-999,-1000],[np.nan,0])#不同的值,进行不同的转换

data.repacle({-999:np.nan,-1000:0})#同上,不同表示

(4)重命名轴索引

key:rename

data.index=data.index.map(str.upper)#就地修改

data.rename(index=str.title,columns=str.upper)#title单词以大写字母开头,不就地修改

data.rename(index={'OHIO':'INDIANA'},columns={'three':'peekaboo'})#部分轴标签更新

data.rename(index={'OHIO':'INDIANA'},inplace=True)#就地修改

(5)离散化和面元划分

key:cut,qcut

cats=pd.cut(ages,bins)#2个参数分别为,年龄组,和分组方式

cats.codes#显示每个元素所属的分组

cats.categories#显示分组方式

np.value_counts(cats)#显示每组有几个例子

pd.cut(ages,bins,right=False)#默认左开,右闭;现在左闭,右开

pd.cut(ages,bins,labels=group_names)#设置面元名称

pd.cut(data,4,precision=2)#传入数字,表示根据最大值和最小值分成对应数字分

pd.qcut(data,4)#根据分位数划分,即每一组内的个数相同,或差一个。

pd.qcut(data,[0,0.1,0.5,0.9,1.])#自定义分位数,即个数分成1:4:4:1.

(6)检测和过滤异常值

key:any

data[(np.abs(data)>3),any(1)]#选出有元素绝对值超过3的行

(7)排列和随机采样

key:permutation,randint,take

sampler=np.random.permutation(5)#即给出0-4排列组合任意一组,不会重复

df.take(sampler)

sampler=np.random.randint(0,len(data),size=10)#从0到len(data)中,随机产生10个数,可能会重复

df.take(sampler)

(8)计算指标/哑变量

key:get_dummiers

pd.get_dummies(df['key'])#key列有k种不同的值,则产生k列,每列分别为这些值,每行在之前对应值下为1,其他为0

pd.get_dummies(pd.cut(values,bins))#get_dummies和cut结合


4.字符串操作

(1)字符串对象方法

key:split,strip,index,find,count,replace

val.split(',')#以逗号分隔

pieces=[x.strip() for x in val.split(',')]#strip用于修剪空白符,包括换行符

'guido' in val #判断是否在val中

val.index(',')#判断,在val的第几位,没找到返回异常

val.find(':')#和index类似,只是find在没找到时放回-1

val.count(',')#','出现的次数

val.replace(',',':')#替换把,换成:

(2)正则表达式

key:compile,findall,search,match,sub

re.split('\s+',text)#分隔符为数量一定的空白符

regex=re.compile('\s+')#先编译

regex.split(text)

regex.findall(text)#返回所有要去除的分隔符

search#和findall类似,返回第一个匹配值

match#只匹配字符串的首部

regex.sub('REDACTED',text)#用前面的字符串替换找到的字符串

(3)pandas中矢量化的字符串函数

key:contains

data.str.contains('gmail')#检测是否含有gmail


 

参考文献:《利用Python进行数据分析》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值