最近工作上,小爬经常需要用python做一些关于excel数据分析的事情,显然,从性能和拓展性的角度出发,使用pandas、numpy是比vba更好的选择。因为pandas能提供诸如SQL的很多查找、过滤功能,性能要比用excel Vlookup之类的公式要快得多,暴力的多!

万事开头难,我们第一步就是要载入excel数据源到pandas的DataFrame中:

技巧一:

当我们的excel中只有某些字段是需要去处理的,这个时候,不建议一次性用read_excel载入默认的所有列,否则影响pandas的载入速度和后面的运算性能。比如:

  1. df = pd.read_excel("data.xlsx", usecols=[0, 5]) # 指定读取第1列和第6列
  2. # 当然也可以用"A,F"代替[0,5]
  3.  
  4. #如果我们要载入1-25列,上面的列表依次列举的写法就比较笨了,可以考虑这样写
  5. df = pd.read_excel("data.xlsx", usecols=list(range(25) ))

实际上,read_excel的参数有很多,具体如下(详见:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html):

  1. pandas.read_excel(io, sheet_name=0, header=0, names=None,
  2. index_col=None, usecols=None, squeeze=False, dtype=None,
  3. engine=None, converters=None, true_values=None,
  4. false_values=None, skiprows=None, nrows=None, na_values=None,
  5. keep_default_na=True, verbose=False, parse_dates=False,
  6. date_parser=None, thousands=None, comment=None,
  7. skip_footer=0, skipfooter=0, convert_float=True,
  8. mangle_dupe_cols=True, **kwds)

这里面还有一个参数很重要,我们读入的excel一般都有表头,但是表头不一定是在第一行,也就是我们要指定header=0的具体值,比如我们告诉panda 这个excel的表头在第五行,从第六行开始才是数据行,我们只需要指定header=4 即可。

技巧二:

我们在做dataFrame处理时,程序经常因为copy报警,比如我们根据某一个字段运算后生成新的字段,或者通过某种算法 对本字段的内容进行更新,都会触发如下报警:

SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

假设我们的运算比较复杂,不能简单用提示的 A.loc[3,4]=5这种,就很难避免这类报警,比如:

  1. data.loc[data.bidder == 'parakeet2004', 'bidderrate'] = 100
  1. 如果您能笃定该操作不会影响原DataFrame,可以考虑用下面的代码关掉报警(谨慎使用):
  1. pd.set_option('mode.chained_assignment', None)
  1. 技巧三:
      
    善于用dropna方法来过滤数据!该方法支持传入列表,对列表元素对应的每个字段同时使用dropna方法:
  1. df=df.dropna(subset=["供应商代码(必填)",'供应商名称(必填)','本月计划支付金额(必填)',"款项性质(必填)","付款条件(必填)"])
  1.  

技巧四:

善于使用map、apply方法来遍历元素结合自定义函数,比如小爬要处理的字段:先要判断该字段对应的元素是否为数字,要过滤掉那些不是数字的行,就可以先定义函数,然后用apply或者map来调用它:

  1. def isNumber(x):
  2. if isinstance(x,float) or isinstance(x,int):
  3. return 1
  4. if isinstance(x,str):
  5. return 0
  6.  
  7. df["本月计划支付金额为数字"]=df["本月计划支付金额(必填)"].map(isNumber) #产生辅助字段
  8. df=df[df["本月计划支付金额为数字"]==1]
  9. df=df[df['本月计划支付金额(必填)']>0]

技巧五:

  判断某个字段的值是否在某个列表,常用.isin(list)方法,比如:

  1. error_df=original_df[original_df["供应商代码(必填)"].isin(common_supplier_list_final)] #common_supplier_list_final为列表对象

如果我们希望取反,找不符合某个列表元素的那些数据集合,就要用到“~”,上面的语句可以改写为:

  1. error_df=original_df[~original_df["供应商代码(必填)"].isin(common_supplier_list_final)] #对正常那部分行项目抛开,取反,关键符号~

技巧六:

擅于使用lambda表达式,尤其是功能很简单的函数,没必要单独自定义,比如,对某个字段的每个值都乘以10000,或者对某字段元素的所有字符串加上前缀“0000”,可以这样写:

  1. result_df["承兑汇票金额"]=result_df["承兑汇票金额"].apply(lambda x:x*10000)
  2. result_df["供应商代码(必填)"]=result_df["供应商代码(必填)"].map(lambda x:""+x if len(x)==6 else x)
  3.  
  4. result_df["供应商代码"]=result_df["供应商代码"].map(lambda x:x[4:]) #去掉供应商代码的前0000

技巧七:

利用drop_duplicates方法去重,有的时候,我们根据几个字段对应的某行值同时相同时,判断这些行是重复的,仅保留第一行,可以这样写:

  1. result_df=result_df.drop_duplicates(['公司代码','供应商代码','供应商名称','本月计划支付金额'],keep='first') #去重

  1.   小爬深知,我们在实际的数据分析过程中,用户提供的数据源往往有很多脏数据,很多空数据,我们做数据处理前先要学会做数据清洗,这就需要用到pandas的很多方法和小知识,唯有逐渐积累,才能慢慢熟悉,为我所用!
  1.  

pandas数据分析小知识点(一)的更多相关文章

  1. 小知识点--crontab

    前言 这两周学了很多东西,还把golang语言基本掌握了,收获还是挺多的.在做安全的过程中,有很多需要定时执行的任务,比如抓取主机数量,端口数据等,这都逃不开linux中的crontab命令,今天分享 ...

  2. python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)

    //2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...

  3. 刚接触Linux,菜鸟必备的小知识点(一)

    身为一个将要大四的学生,而且还是学计算机的没有接触过linux简直是羞愧难当.这个假期做了一个软件测试员,必须要熟悉linux的操作,所以对于我这个菜鸟我也就说几点比较重要的小知识点吧. 第一.cd指 ...

  4. Java学习过程中的总结的小知识点(长期更新)

    Java学习过程中的总结的小知识点 (主要是自己不会的知识和容易搞错的东西) 计算某个程序运行的时间 long stime=System.currentTimeMillis(); copy3(file ...

  5. 【转】HTML5的小知识点小集合

    html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于<h ...

  6. AngularJS的小知识点

    小知识点:$scope和$rootScope (1)每次使用ngController指令,都会调用控制器的创建函数,创建出一个控制器对象. (2)每次创建一个控制器对象,AngularJS都会创建一个 ...

  7. js中关于value的一个小知识点(value既是属性也是变量)

    今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况是常见情况,会弹出“测试内容” <input type="button" v ...

  8. html5的小知识点小集合

      html5的小知识点小集合 html5知识   1.  Doctype作用?标准模式与兼容模式各有什么区别? (1).<!DOCTYPE>声明位于位于HTML文档中的第一行,处于< ...

  9. [BS] 小知识点总结-05

    [BS] 小知识点总结-05 1. 不论UIWindow的rootViewController是navC.tabBarC还是VC,也不管modalVC和rootVC中间隔着多少个VC,但是modal出 ...

随机推荐

  1. UVa 623 大整数乘法

    UVa 623 计算N! n上限为1000自然不能直接算.所以可以开一个数组f[],f[]每一位存N!结果的6位.如果按进制来理解,就是10^6进制: 例如 11!=39916800=11*10!=1 ...

  2. Auto CAD 安装问题 “acad.exe - 系统错误 ”

    Auto CAD 安装不上,提示“cad装不上 提示无法启动此程序,因为计算机中丢失 ac1st16.dll” 解决方法: 我的电脑——>右键 属性——>高级选项卡(win7的是高级系统设 ...

  3. mysql 中合并查询结果union用法 or、in与union all 的查询效率

    mysql 中合并查询结果union用法 or.in与union all 的查询效率 (2016-05-09 11:18:23) 转载▼ 标签: mysql union or in 分类: mysql ...

  4. Python基础:14生成器

    yield表达式只用于定义生成器函数,且只能存在于函数的定义体中.只要一个函数内部使用了yield表达式,则该函数就成为生成器函数. 当调用生成器函数时,它返回一个称为生成器的迭代器.然后该生成器控制 ...

  5. javascript内置函数

    1.Date:日期函数属性(1):constructor 所修立对象的函数参考prototype 能够为对象加进的属性和方法办法(43):getDay() 返回一周中的第几天(0-6)getYear( ...

  6. 《attention is all you need》解读

    Motivation: 靠attention机制,不使用rnn和cnn,并行度高 通过attention,抓长距离依赖关系比rnn强 创新点: 通过self-attention,自己和自己做atten ...

  7. protobuf DNK下的编译

    protobuffer 编译配置 mkdir -p ./cmake/build cd ./cmake/build cmake \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ ...

  8. c++第一次的个人作业

    循环结构是c++中重要的结构用以实现代码的反复使用 三种不同的循环结构以及嵌套是必须认识与能够使用的 三种循环结构分别是: 在for循环中可以在for后的括号内加入初始条件,循环条件与参数变化.使得整 ...

  9. supersockets扩展服务器配置

    关键字: 扩展配置, 自定义配置, 自定义属性, GetChildConfig, 读取配置,子节点 当你使用 SuperSocket 实现 Socket 服务器的时候,不可避免的需要在配置文件中定义一 ...

  10. CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)

    记录下在CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)过程笔记. 工具 VMware版本号 : 12.0.0 CentOS版本 : 7.0 一.修改 ...