zoukankan      html  css  js  c++  java
  • Pandas 数据处理

    常规数据处理:

    1. 数据类型转换   
      1.   df.A.astype   str,int, float,long
      2.     百分比      map(lambda  s:'{0:.2f}%'.format(s*100))
      3.   四舍五入,精度控制
      4.   时间类 map 
        1.  string->date pd.to_datetime(s).date()    
    2. 重命名列名    df.rename(columns= xx ,inplace=True)
    3. 排序  df.sort_values(by=['xx','yy'])

    4. 删除列  df.drop('xx',axis=1)
    5. 增加列 
      1.   df['B']=xxx   
      2.   df['B']=df['A'].apply(  )
      3.     df['C']=df[['A', 'B']].apply(lambda x: '_'.join(str(value) for value in x), axis=1)    C=A_B
    6. 拆分列    
      1.   拆json   pd.concat([dt.drop('response_data',axis=1), pd.DataFrame(dt['response_data'].apply(lambda t:eval(t)).to_dict()).T], axis=1)
    7. 填充缺失值   df.fillna(0,inplace=True)
    8. 列名重排序 
    9. 替换值   vals_to_replace = {'Small':'1', 'Medium':'5', 'High':'15'}
      1.    df.replace(   { 'A' :vals_to_replace   }    )       替换多个列数据
      2.   df.A=df.A.map(vals_to_replace )
      3.   df.A.replace(vals_to_replace , inplace=True)
      4.   df.A.update(pd.Series(vals_to_replace ))
    10. 去重  df.dropna()

    过滤数据:

    1.  df[ df['A']=='xx' ]   可以 =、>、  <、
    2.  df [ df['A'].isin( [a,b,c ] )   ]    ,  df [~ df['A'].isin( [a,b,c ] )   ]    为取反
    3.    df.query(' xx<A<yy ')
    4.   df.str.contains      或 df['A'].str.contains
      1.   pattern=u'xxyy|zz  df['A'].str.contains(pattern)== False/True
    5.  正则表达式 regex
    6.  以上过滤条件均可以组合,  用 df[  ( df['A']=='xx' )   |   ( df['B'].isin([a,b,c])  & df['C'].contains()     ],   &  和 | ;  多个条件需要单独加 

    赋值:  ix, iloc

    1.  df.loc[df[' A '] > a, 'A'] = 1
    2. df.ix[ df.B.isin(['X','Y','Z']), 'A'] = 'T'

    数据分组、切分、拼接

     

       1 .拼接

      1. 左右 merge   pd.merge(df1,df2,on='A', how=‘left’)    或者  df1.merge(df2,on='A', how='left' )
        1.   index也可以merge ,   pd.merge(df1,df2,left_index=True,right_index=True)
      2. 上下 append   df1.append(df2)       
    1. 切分
      1.  cut     
        1.    pd.cut([1,10],10,right=True)    10等分
        2. bins=[0,50,100,200,500,1000,3000]
          cats=pd.cut(df['A'],bins) ,产生一个cat 新列
      2. qcut
    2.   分组  groupby
      1.    s.groupby('A').filter(lambda s:len(s)>10)['A']
      2.    s.groupby('A').filter(lambda s:len(s)>10)['A'].value_counts()     出现10次以上的计数
      3.    s.groupby('A').filter(lambda s:s['A'].count>10)['A'].value_counts()  出现10次以上的计数  

      4.   透视表 pivot_table     

    Python数据类型   dict ,list ,tuple, dataframe ,json , str

    1.   list of dict ,dict里面的元素是list       df=pd.Dataframe( dict )
    2.   sql in      str(tuple(list))
    3.   json =json_loads(str)       str->json
    4.   df=json_normalize(json)   json->dateframe   只有一行的dataframe

     数据描述

    1.  size  df[ df['A'] ==xx'].size()         
    2.  value_counts
      1.   后面可以接order
    3.   max,min ,count
    4.  info()  ,describe()

    pandas 与 excel 交互

    1. 读取  pd.read_excel(  file_path     )     
      1. 如果不想把某列字符转成数字  converters={'A': str} ,  多见于身份证号,合同编号等等
      2.  sheet_name=' sheet名称' ,sheetname= 0,1,2 编号 。不指定默认第1个sheetname   
    2. xls=pd.ExcelFile( file_path )
      1.        xls.sheet_names   
      2.   xls.parse(xls.sheet_names[i] )
    3. 保存  pd.to_excel( file_path, index=False, encoding='utf-8')  
    4. xls=pd.ExcelWriter( file_path, encoding='utf-8', engine='openpyxl')  
      1.  和3结合能将多个sheet写至一个xls
        df.to_excel(xls, sheet_name='xx',index=False) 
        xls.save()  
      2. encoding 编码,否则中文保存可能报错

    pandas 与 csv 交互

    1. 读取  pd.read_csv()
    2. 保存 df.to_csv(columns=['A', 'B', 'C'], sep=' ', index=False)    指定列,分隔符

    pandas 与 sql 交互

    from  sqlalchemy import create_engine

    1.   读取  pd.read_sql(sql, engine)
    2.   保存  pd.to_sql (name=, engine, if_exists='append' ,chunksize=10000,index=False)
      1.  if_exists
        • fail: If table exists, do nothing.
        • replace: If table exists, drop it, recreate it, and insert data.
        • append: If table exists, insert data. Create if does not exist
      2.  index_col :  column=>index  , index_label: index=>column  
      3.  index=True/False  ,默认是False
      4.  dtype={'date': datetime.date}  ,engine 必须是 sqlalchemy ,不能是MySQLdb   
    3.   自定义插入 
      1.  sql_update = """

        update tabel  set A= %s where B= %s;
        """
        engine.execute(sql_update,df[['A','B']].values.tolist() )
         

  • 相关阅读:
    postgres配置主从流复制
    laravel5如何创建service provider和facade
    postgres中几个复杂的sql语句
    Laravel5设计json api时候的一些道道
    技术晨读_2015_4_13
    PHP 中的Closure
    l5如何通过路由走api版本回退查找设置
    postgres中的中文分词zhparser
    postgres中的视图和物化视图
    问题:Virtual Box如何复制镜像
  • 原文地址:https://www.cnblogs.com/wusthjp/p/8653190.html
Copyright © 2011-2022 走看看