python数据分析⼼得体会_Python数据处理总结
Python可以很好地完成预处理任务,本⽂对python常⽤的numpy & pandas做⼀些总结。
1. ⽂本读写
python本⾝就带有open()函数,配合readline()/write()函数可以完成读写功能。但注意pandas也有很强⼤的读写能⼒,包括函数
python怎么读csv数据read_csv()
to_csv()
read_excel()
to_excel()。
这⾥提⼀点:read_csv()函数可以指定index,column name,encoding type,header等等。作者曾经遇到过⼀个⽐较strange的问
题,read_csv()与read_excel()的不同。⽐如,读⼊的第⼀列是c1,c2,c3,..。但是read_csv()的c1前⾯
却带了⼀个未知符号`,即显⽰成了`c1。当时调了半天都没有明⽩这个`是怎么产⽣的,不知道哪位⼤神能够解答。最后⽆奈⽤read_excel()才解决。
python还有⼀个叫codecs的模块,可以很好的解决decode与encode的问题,它可以在读⼊时就选择相应的coding⽅式。
2. 数据处理
这⼀部分要说的内容就太多了,先来简单区分⼀下numpy和pandas。简单说,pandas是基于numpy的,numpy可以定义array和dataframe,pandas中可以定义dataframe和series。(可能不是很准确)
之前提到的⽂本读写,pandas可以直接将内容读成dataframe或series的形式。同时dataframe和series也可以由list或dictionary⽣成。这⾥我的理解是dictionary就是带有列名的list。
dataframe有⼀个函数是astype(),可以修改元素类型。这⾥要注意⼀点:当dataframe或series含有null值时,astype(np.float64)或astype(np.int64)将不成功,必须将null值去除后才能convert string into numeric value。去除或者填充null值可以使⽤dropna()或者fillna()函数。
强⼤的lambda函数
lambda函数可以应⽤于map与apply函数中,对于调⽤map与apply的dataframe,可以⾃动对dataframe做element-wise的操作
关于异常值处理,⽬前我还只⽤到了缺失值处理,但不清楚出现异常值,有没有办法将它设为0?可以考虑使⽤lamda函数。
df['new_col'] = df['old_col'].map( lambda x: func(x) )
map是⼀个⾮常强⼤的函数,这⾥再举⼀个例⼦,Gender原先有两个值Male和Female,这⾥要将其转为1和0。
df['Gender'] = df['Sex'].map( {'female': 0, 'male': 1} ).astype(int)
再举⼀个例⼦,有⼀个dataframe,先需要对其中某⼏列做操作,从⽽得到新的⼀列,可以⽤如下⽅法:
df[new_column] = df.apply(lambda x : func(x[col1],x[col2],...,x[coln])
, axis=1)
根据以上例⼦可以发现,lambda函数中的x可以是某⼀⾏,可以是某⼀列,也可以是某个dataframe。
⾏列添加与转置
pandas添加⾏列以及⾏列转换不是特别⽅便。⽐如为了实现合并多列数据得到⼀个新的DataFrame,可以使⽤pd.concat()将多⾏数据合在⼀起,通过指定参数axis=1即可按列合并。
但它的⼀⼤长处是⽀持类似sql的基本操作,这点⾮常强⼤。
pandas提供了⼀个类似于关系数据库的连接(join)操作的⽅法,可以根据⼀个或多个键将不同DataFrame中的⾏连接起来语法如下:
merge(left, right, how='inner', on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=('_x', '_y'), copy=True, indicator=False)
⽤于通过⼀个或多个键将两个数据集的⾏连接起来,类似于 SQL 中的 JOIN。该函数的典型应⽤场景是,针对同⼀个主键存在两张包含不同字段的表,现在我们想把他们整合到⼀张表⾥。在此典型情况下,结果集的⾏数并没有增加,列数则为两个元数据的列数和减去连接键的数量。
on=None ⽤于显⽰指定列名(键名),如果该列在两个对象上的列名不同,则可以通过 left_on=None, right_on=None 来分别指定。或者想直接使⽤⾏索引作为连接键的话,就将 left_index=False, right_index=False 设为 True。
how='inner' 参数指的是当左右两个对象中存在不重合的键时,取结果的⽅式:inner 代表交集;outer 代表并集;left 和 right 分别为取⼀边。suffixes=('_x','_y') 指的是当左右对象中存在除连接键外的同名列时,结果集中的区分⽅式,可以各加⼀个⼩尾巴。对于多对多连接,结果采⽤的是⾏的笛卡尔积。
参数说明:
left与right:两个不同的DataFramehow:指的是合并(连接)的⽅式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner on : 指的是⽤于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键left_on:左则DataFrame中⽤作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时⾮常有⽤。
right_on:右则DataFrame中⽤作 连接键的列名left_index:使⽤左则DataFrame中的⾏索引做为连接键right_index:使⽤右则DataFrame中的⾏索引做为连接键sort:默认为True,将合并的数据进⾏排序。在⼤多数情况下设置为False可以提⾼性能
suffixes:字符串值组成的元组,⽤于指定当左右DataFrame存在相同列名时在列名后⾯附加的后缀名称,默认为('_x','_y')copy:默认为True,总是将数据复制到数据结构中;⼤多数情况下设置为False可以提⾼性能indicator:在 0.17.0中还增加了⼀个显⽰合并数据中来源情况;如只来⾃⼰于左边(left_only)、两者(both)
3. 学习模型
python有⾮常强⼤的sklearn⼯作包,已经成为最常⽤的ml⼯具之⼀。在sklearn包中,数据要求为数组,⽽不是pandas的dataframe。
因此经过前⾯的数据处理,仍然有两件事需要完成:
决定我们需要留下那些列
将pandas.DataFrame转化回numpy.array。
在pandas中你可以⽤.info()⽅法查看列的类型,或者直接输⼊df.dtypes。
若要仅显⽰type为object的列:
df.dtypes[df.dtypes.map(lambda x: x=='object')]
下⼀步是⽤drop()去掉我们不⽤的这些列,⽤dropna()去除含有缺失值的⾏,最终的步骤是将其转化回Numpy数组:
train_data = df.values
最后来个进阶点的问题:
现在我有⼀个样本集df,我想将其随机打乱后抽取其中的N个作为训练集剩下的作为测试集,该怎么做呢?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论