数据规整化

一、合并数据集

  1. 数据库风格的DataFrame合并,pd.merge(df1,df2)
    –显式指定键,on='jianming'
    –分别指定,left_on='lkey',right_on='rkey'
    –默认是做交集,可以修改成并集 how='outer',还可以选择right,left
    –根据多行合并,传入一个由列名组成的表,on=['key1','key2']
    –对重复的不是键的列名加后缀,suffixes=('_left','_right')

  2. 索引上的合并
    –连接键在索引之中,left_index=True,right_index=True
    —-对于层次化索引,必须以列表的形式指明做合并的多个键on=['key1','key2']
    –另一种是join,可以很方便的实现按索引合并,形如 left2.join(right2,how='outer')
    —-索引和某个列,left2.join(right2,on='key',how='outer')
    —-还可以一次传入几个DataFrame和前面的数据框合并

  3. 轴向连接 pd.concat([s1,s2,s3])
    –默认是在长度上连接,在宽度上是axis=1
    –默认是有序并集,可以修改成为交集,join='inner'
    –指定要用的索引(原数据没有的话填充NA),join_axis=[['a','b']]
    –创建层次化索引区分连接片段,有几段就写几个,keys=['one','two','three']
    –传入不是别表而是字典,字典就会被当作keys选项的值
    –默认保留原行索引,如果行索引和当下的分析工作无关,可以不保留,ignore_index=True

  4. 合并重叠数据
    –判断a是不是缺失,不缺失取a,缺失取b,np.where(pd.isnull(a),b,a)
    –同上,b.combine_first(a)

二、重塑和轴转向

  1. 重塑层次化索引
    –把数据的列转化为行,data.stack()
    –把数据的行转化为列,data.unstack()
    –操作的是最内层,可以传入分层级别的编号和名称,对其他级别进行unstack的操作
    –stack默认滤除缺失值,dropna=False可以进行保留
    –unstack的操作,作为旋转轴的级别将会成为结果中的最低级别

  2. 长格式转化为宽格式
    ldata.pivot('date','item',value')第一个是行索引,第二是列索引,最后是填充数列的列名
    –填充数列的列有两列,第三个参数又不写,就会有层次化的列

三、数据转换

  1. 移除重复数据
    –返回布尔型是否是重复数据,data.duplicated()
    –返回移除了重复行的DataFrame,data.drop_duplicates()
    –这两种方法都默认是判断全部列,可以指定列,data.drop_duplicates('k1')
    –这两个方法默认保留第一个,take_last=True保留最后一个

  2. 利用函数或映射进行数据转换,使用map
    –map方法可以接受一个函数或含有映射关系的字典型对象
    data['food'].map(str.lower).map(meat_to_animal)
    data['food'].map(lambda x: meat_to_animal[x.lower()])

  3. 替换值
    data.replace(-999,np.nan)
    data.replace([-999,-1000],np.nan)
    data.replace([-999,-1000],[np.nan,0])
    –传入参数也可以是字典

  4. 重命名轴索引
    –map方法,data.index.map(str.upper)
    –创建修改后的副本,data.rename(index=str.title,columns=str.upper)
    —-可以结合字典对象对部分索引更新
    —-如果直接修改原数据,inplace=True

  5. 离散化和面元划分

    bins=[18,25,35,60,100]
     cats=pd.cut(data,bins)

–分成(18,25],(25,35],…(60,100]
–cats.labels 返回数字表示类别的属性
–cats.levels 不同分类名称的数组
–修改那边是闭端,right=False
–设置自己的分类名称,labels=['youth','Senior']
–如果输入的不是分类边界而是组数,会按照最大值和最小值均匀分组
–qcut类似于cut是对数据按照分位数进行划分

6.检测和过滤异常值
–筛选出所有含有绝对值超过3的值的行data[(np.abs(data)>3).any(1)]
–对所有绝对值超过3的值设为3和-3,data[(np.abs(data)>3)]=np.sign(data)*3

7.排列和随机采样(对行)
–np.random.permutation(5) 对0-4随机
–不放回采样df.take(np.random.permutation(len(df))[:3})
–返回采样 data.take(np.random.randint(0,len(data),size=10))

8.计算指标/哑变量
pd.get_dummies(df['key'])
–加上前缀:pd.get_dummies(df['key'], prefix='key')
–对于某行同属于多分类p215

四、字符串操作

  1. 字符串对象方法
    –拆分
val = 'a,b,  guido'
val.split(',')

–拆分并删除空格 pieces = [x.strip() for x in val.split(',')]
–字符串连接 first + '::' + second + '::' + third '::'.join(pieces)
–判断字符串是否在其中 'guido' in val
–子串定位 val.index(',')或val.find(':') 返回第一个字符所在的位置,没找到前者错误,后者返回-1
–返回子串出现的次数val.count(',')
–替换,也可以用于删除val.replace(',', '::') 删除:val.replace(',', '')

2.正则表达式:一种灵活的在文本中搜索或匹配字符串模式的方式

import re
text = "foo    bar\t baz  \tqux"
re.split('\s+', text)

–自己编译regex regex = re.compile('\s+') regex.split(text)
–获得匹配regex的所有模式,regex.findall(text)
–返回第一个匹配项 regex.search(text)
–匹配字符串首部的模式 regex.match(text)
–将匹配到的模式替换 regex.sub('REDACTED', text)
–参数,对大小写不敏感 flags=re.IGNORECASE
–模式分段:将分段的各部分用圆括号表示

pattern = r'([A-Z0-9._%+-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})'
regex = re.compile(pattern, flags=re.IGNORECASE)

—-可以用group的方法返回一个由模式各段组成的元组

m = regex.match('wesm@bright.net')
m.groups()

—-sub可以通过\1,\2等符号来访问各个匹配项中的分组

print(regex.sub(r'Username: \1, Domain: \2, Suffix: \3', text))

3.pandas中矢量化的字符串函数
–能够跳过NA值的字符串操作办法,利用Series的str属性
–检查是不是含有子串:data.str.contains('gmail')
–使用正则表达式 data.str.findall(pattern, flags=re.IGNORECASE)
–获取元素matches.str.get(1) 或matches.str[0]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值