赞
踩
两年前咬咬牙跳了Matlab的坑,入手了Python,从此一发不可收的成了PY的重度依赖者。本人研究工作皆涉及大量的数据处理工作,PY和R作为数据分析的两驾马车,得其一者得天下。另外,我接触的许多软件皆比较小众,每次在涉及二次开发时,很多都是Matlab之流不支持的,而PY又往往是官方指定接口。因此,PY作为程序界的黏合剂,实在是方便至极。
如今机器学习和深度学习之热,再次炒热了PY。当然,涉及到统计模型,R的功力还是更深的。很多前沿或者有一定深度的统计模型,在R中都能快速实现,但在PY中则没有现成的package。因此,现在不得不承认,PY和R,各有千秋,要都熟稔才行。
写此文,是为记录一些灵感,供广大PY爱好者,也供自己,学习与查阅。
List形式的for in if else
爬到一组房价数据,但经纬度皆以'121.43247'的string形式存储于DataFrame的一列中,且对于空缺值,以int形式的0或者float行驶的0.00填充。也就是说,该列存在多种数据格式,必须写条件判断才能循环。现需要将其进行修正提取,将'121.43247'提取为121.43247,而对于空值,统一以int形式的0填充。
于是,最低级的写法出现了:
- for jj in range(0, len(all_fangjia)):
- if all_fangjia.loc[jj, 'len'] > 3:
- all_fangjia.loc[jj, 'new_lat'] = all_fangjia.loc[jj, 'lat'].split(''')[1]
- all_fangjia.loc[jj, 'new_lon'] = all_fangjia.loc[jj, 'lon'].split(''')[1]
该法思路清晰,但速度奇慢。对该列数据进行遍历,先判断该数据长度,如果大于3,说明是string形式的,然后再按照'''进行拆分(需要用来转义),选取第二个值进行提取。
思路是对的,但速度实在太慢了。于是,就要请出循环的list风格化了:
- all_fangjia['new_lon'] = [var.split(''')[1] if len(var) > 3 else 0 for var in all_fangjia['lon']]
- all_fangjia['new_lat'] = [var.split(''')[1] if len(var) > 3 else 0 for var in all_fangjia['lat']]
将代码压缩至了两行,速度更是提升了几十上百倍(具体提升量级没算,但反正速度是飞快的了)。此法非常关键,掌握了对之后的数据处理效率大有提升。
佛系空格分隔符的处理
在拿到某些奇葩的原始数据文件时,其不同列间的分隔不是传统的',',而是奇葩的不规整的空格符,也就是说,某两列用了三个空格符来分隔,某两列则用了四个,甚至在一列中,某两行用了2个空格分隔,某两行则用了3个。。
对于这种佛系空格分隔符,一种处理方法就是用正则(re)表达式,而另一种非常简单的方法,则是:
- import pandas as pd
- tem=pd.read_csv('583211-2017.out', delim_whitespace=True, engine='python')
即在熊猫包里面的read_csv中,设置delim_whitespace=True即可。
字符串数据转化为数字编号
比如有N个样本,且存在一列专门对其类别进行标记,但标记用的全是字符串,如“大”、“中”、“小”。为了之后处理方便,需要将其变成0、1、2这种数字形式。这时就需要请出category类型来操作了。相关操作皆针对DataFrame格式实现。
- obj_df["body_style"] = obj_df[“body_style"].astype('category')
- obj_df["body_style_cat"] = obj_df["body_style"].cat.codes
绘图时批量改变所有字体大小
在利用matplotlib绘图时,题目、坐标轴标签、坐标轴名称等等的字体大小都需要分别设置,非常麻烦,而下面的方法则可以批量一次性设置,修改起来也就随之方便了。
应注意,如果有多个ax,则还需要再嵌套一层循环,先指向某一个ax.
- import matplotlib.pyplot as plt
- fig,ax=plt.subplots()
- for item in ([ax.title, ax.xaxis.label, ax.yaxis.label] +
- ax.get_xticklabels() + ax.get_yticklabels()):
- item.set_fontsize(20)
批量快速导入Oracle
做数据工作的,拿Python去接数据库是非常常见的事情,而Oracle又是数据库里面的老大哥。在此不介绍如何安装接口包cx_Oracle,只介绍如何快速将大量数据一次性导入到Oracle中。
在没Get到此技能之前,我都是一条条的往里面插入数据的,数据量小还好,一旦大起来,速度就奇慢无比了。
于是,便有了下面的思路:先打包,再导入:
- #导入连接包
- import cx_Oracle as oracle
- db = oracle.connect('scott/redhat@192.168.223.138:1521/oracle.test')
- #对待导入的数据进行处理
- DFV = DFV.fillna('None')
- DFV = DFV.values.tolist()
- rows = []
- for jj in range(len(DFV)):
- # 转list
- row = (DFV[jj][0], DFV[jj][1], DFV[jj][2], DFV[jj][3], DFV[jj][4], DFV[jj][5], DFV[jj][6])
- rows.append(row)
- # 写入数据
- cr = db.cursor()
- cr.prepare(
- 'insert into OTJ_WATERLINK_WK2 (linkid,fromnode,LONGITUDE,LATITUDE,GRIDID,ROADNAME,SECT) values (:1, :2, :3, :4, :5, :6, :7)')
- cr.executemany(None, rows)
- db.commit()
- cr.close()
试过的都知道,速度杠杠的。再也不用担心大
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。