您的位置:首页 > 编程语言 > Python开发

四、数据规整化:清洗、转换、合并和重塑

2018-03-08 21:37 363 查看
1、合并数据集(merge,join,concat)

pandas对象中的数据可以通过一些内置的方式进行合并

* pandas.merge可以根据一个或者多个键值连接起来,就是SQL中的数据库连接工作。

* pandas.concat可以沿着一条轴将多个对象堆叠在一起

* 实例方法combine_first可以讲重复数据编接在一起 ,用一个对象中的值填充另一个对象中的缺失值(外连接)。

1>> 处理重复列名的问题

pandas会自动添加后缀

pd.merge(left,right,on = ‘key1’)

后缀可以通过suffixes选项来指定

pd.merge(left,right,on = ‘key1’,suffixes = (‘_left’,’_right’))

2>>索引上的合并(merge,join)

pd.merge(left2,right2,how = ‘outer’,left_index = True,right_index = True)

DataFrame有一个join实例方法,它能更方便地实现按索引合并。还可以用作合并多个带有相同或者相似索引的DataFrame对象,而不管有没有重叠的列

left2.join(right2,how = ‘outer’) join方法类似于左连接

merge(默认inner连接):

on:用于连接的列名 on=“key” 也可以分别指定:left_on=“lkey” right_on=“rkey” left_index=True(索引连接)

how:指定inner,outer,left,right

join(默认左连接) left.join([right,another])

concat(默认axis=0行连接)

join=inner得到交集;join=outer得到并集

3>>轴向连接(堆叠、绑定)

一种合并运算为连接(concatenation),绑定(binding)或者堆叠(stacking)。

Numpy有一个用于合并原始Numpy数组的concatenation函数:

concat默认行连接。keys参数用于区分连接的片段,建立层次化索引。

4>> 合并重叠数据(where,combine_first)

还有一种数据是不能简单通过merge、concatenation解决的。比如,有可能部分或者全部索引重叠的两个数据集。(where语句)

combine_first也是做同样的事,可以看作用参数对象中的数据 #为调用者对象的确实数据“打补丁”

2、重塑和轴向旋转(stack,unstack,pivot)

1>>重塑层次化索引

stack(),unstack(默认level=-1).

2>>将长格式旋转为宽格式(pivot(行索引列名,列索引列名,填充dataframe值/数据的列名))

下面就是将data、item作为行、列名,value填充进二维表

pivoted = ldata.pivot(‘date’,’item’,’value’)

pivot其实只是一个“快捷方式而已”,用set_index创建层次化索引,再用unstack重塑

unstacked=data.set_index([‘date’,’item’]).unstack(‘item’)

3、数据转换

1>> 移除重复数据(duplicated,drop_duplicates)

duplicated:判断是否有重复行,返回布尔

drop_duplicateds:返回移除了重复行的dataframe(参数 keep=last返回最后一组组合)

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

1.Series的map(dict)方法可以接受一个函数或含有映射关系的字典型对象

2.map(str.lower)转换成小写

3>> 重命名轴索引(rename):复制dataframe并对其索引和列标签进行赋值

替换值 (replace)

4>>离散化和面元划分(pd.cut,qcut)

cat=pd.cut(元数据,面元边界值组成的列表)

可以设置自己的面元名称,设置label是即可

group_names = [‘Youth’,’YoungAdult’,’MiddleAged’,’Senior’]

pd.cut(ages,bins,labels = group_names)

cat.categories 显示划分区间;cats.labels(codes)显示划分结果;pd.value_counts(cat)显示每个区间的元素个数

qcut函数是一个类似于cut的函数,可以根据样本分位数对数据进行面元划分。根据数据,cut可能无法使各个面元数量数据点相同,qcut使用的是样本分位数,因此可以得元素个数相同的面元。

5>> 检测和过滤异常值

np.abs()绝对值 data[(np.abs(data)>3).any(1)] 含有绝对值大于3的行

np.sign返回由1和-1组成的数组,表示原始值的符号。

6>> 排列和随机采样(permutation)

df.take(np.random.permutation(len(df))[:3]) :随机重排序

7>> 计算指标/哑变量(get_dummies(不同的变量值的列名/pd.cut(values,bins)))

将分类变量(categorical variable)转换为“哑变量矩阵”(dummy matrix)或“指标矩阵”(indicator matrix)。如果DataFrame的某一列有k各不同的值,可以派生出一个k列的矩阵或者DataFrame(值为1和0)

step1:处理数据,使得数据规整化

genre_iter = (set(x.split(‘|’)) for x in movies.genres)

genres = sorted(set.union(*genre_iter))

step2:创建dummies零矩阵

dummies = DataFrame(np.zeros((len(movies),len(genres))),columns = genres)

step3:填入1

for i,gen in enumerate(movies.genres):

dummies.ix[i,gen.split(‘|’)] = 1

step4: join连接,添加前缀

movies.join(dummies.add_prefix(“genre_”))

3、字符串操作

1>> 字符串对象方法(split,strip,“+”/join,in/find/index,count,replace)

first,second,third=piece

“::”.join(piece) 等价于 first+”::”+second+”::”+third

注意:strip()只去除首尾的空格;

replace(‘c1’,’c2’):把字符串里的c1替换成c2。故可以用replace(’ ‘,”)来去掉字符串里的所有空格

split():通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串

2>> 正则表达式

re模块的函数分为3类:模式匹配、替换、拆分

(1)

regex=re.compile(‘\s+’) 一个或多个空白符,先编译后使用

findall:返回匹配模式的所有字符串组成的列表;

search:返回匹配的第一个字符串对象地址

match:只匹配出现在字符串开头(字符串的首部)的模式(不匹配返回None),返回的是匹配的对象地址

sub(“替换的字符串”,原来的字符串):将匹配的模式替换为指定的字符串

(2) re.compile(strPattern[, flag]):

这个方法是Pattern类的工厂方法,用于将字符串形式的正则表达式编译为Pattern对象。 第二个参数flag是匹配模式,取值可以使用按位或运算符’|’表示同时生效,比如re.I | re.M。

可选值有:

* re.I(re.IGNORECASE): 忽略大小写(括号内是完整写法,下同)

* M(MULTILINE): 多行模式,改变’^’和’$’的行为(参见上图)

* S(DOTALL): 点任意匹配模式,改变’.’的行为

* L(LOCALE): 使预定字符类 \w \W \b \B \s \S 取决于当前区域设定

* U(UNICODE): 使预定字符类 \w \W \b \B \s \S \d \D 取决于unicode定义的字符属性

* X(VERBOSE): 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。

3>> pandas中的矢量化的字符串函数(跳过na值)

问题: 通过Series的map函数,所有字符串和正则表达式方法都能被应用于各个值(传入lambda表达式或其他函数),但是如果存在NA就会报错。

解决: Series有一些能够跳过NA值得字符串操作方法,通过Series的str属性可以访问这些方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐