• pandas数据分析小知识点(一)


      最近工作上,小爬经常需要用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:"0000"+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的很多方法和小知识,唯有逐渐积累,才能慢慢熟悉,为我所用!
     
  • 相关阅读:
    SVN 使用学习记录
    jQuery 获取 URL信息
    JS扩展方法
    .Net 加密 哈希
    SQL Serverf 索引
    SQL Server索引
    SQL Server索引
    insert into select 多个表
    Mysql数据库自带四个数据库的解析
    转: MySQL5.7 ERROR 1142 (42000)问题
  • 原文地址:https://www.cnblogs.com/new-june/p/11818713.html
Copyright © 2020-2023  润新知