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进行数据分析》