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

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

技巧一:

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

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

pandas.read_excel(io, sheet_name=0, header=0, names=None,
index_col=None, usecols=None, squeeze=False, dtype=None,
engine=None, converters=None, true_values=None,
false_values=None, skiprows=None, nrows=None, na_values=None,
keep_default_na=True, verbose=False, parse_dates=False,
date_parser=None, thousands=None, comment=None,
skip_footer=0, skipfooter=0, convert_float=True,
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这种,就很难避免这类报警,比如:

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

技巧四:

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

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

技巧五:

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

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

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

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

技巧六:

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

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

技巧七:

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

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

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

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. 【C++】STL :栈

    c++stack(堆栈)是一个容器的改编,它实现了一个先进后出的数据结构(FILO) 使用该容器时需要包含#include<stack>头文件: 定义stack对象的示例代码如下: sta ...

  2. HUD-1708_FatMouse and Cheese

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  3. Python基础:10函数参数

    局部命名空间为各个参数值创建了一个名字,一旦函数开始执行,就能访问这个名字了. 在函数调用时,有非关键字参数和关键字参数之分,非关键字参数必须位于关键字参数之前. 在函数定义时,严格的顺序是:位置参数 ...

  4. 2019-2-24-VisualStudio-过滤输出窗口文本

    title author date CreateTime categories VisualStudio 过滤输出窗口文本 lindexi 2019-2-24 11:10:7 +0800 2019-0 ...

  5. CDQ分治 三维偏序

    这应该是一道CDQ分治的入门题目 我们知道,二维度的偏序问题直接通过,树状数组就可以实现了,但是三维如何实现呢? 我记得以前了解过一个小故事,应该就是分治的. 一个皇帝,想给部下分配任务,但是部下太多 ...

  6. win10 uwp httpClient 登陆CSDN

    本文告诉大家如何模拟登陆csdn,这个方法可以用于模拟登陆其他网站. HttpClient 使用 Cookie 我们可以使用下面代码让 HttpClient 使用 Cookie ,有了这个才可以保存登 ...

  7. PHP实现购物车的思路和源码分析

    正文内容 这里主要是记录下自己的购物车的思路,具体功能实现,但是尚未在实际项目中用到,不对之处欢迎指正 项目中需要添加购物车. 目录说明 buy.php 点击购买之后的操作 car.php 购物车,显 ...

  8. linux 一些简单操作

    vim   ----三种模式 1.命令模式           2.输出模式       3.底线命令模式 w(e) 移动光标到下一个单词 b 移动到光标上一个单词 数字0 移动到本行开头 $ 移动光 ...

  9. 2019-7-29-NetBIOS-计算机名称命名限制

    title author date CreateTime categories NetBIOS 计算机名称命名限制 lindexi 2019-07-29 09:59:17 +0800 2018-12- ...

  10. 建立一个Web项目及一些错误解决办法

    培训之前,先自学一波,写一个从Hello World,然后记录一下每天学习Java Web的过程:东西很多,有用的会写大量解释,希望能最终学完 然后搞定这门语言吧. 1.配置tomacat:点击win ...