Python 数据处理——小函数

preface:最近在整内比赛MDD。遇到一些数据处理方面的事情,用python pandas是最为方便的,远比我想象的强大。几行代码就完成了数据的处理,多个文件的融合,再用sklearn里面的模型跑一跑,就能得到结果。为此,经常记录下来,对数据处理的应用。

一、Pandas合集

  1. df = pd.read_csv('%s/%s' % (input_path, file_name)):read_csv()读入文件函数,文件以tab隔开则read_csv(fileName, sep="\t")。分两个变量:input_path和file_name传入更佳。
  2. poiLngNotNull = pd.notnull(df["poi_lng"]):notnull()筛选函数。数据预处理:取列名为poi_lng不为空的行。
  3. df.loc[poiLngNotNull, 'poi_lng']:loc()函数。定位到poiLngNotNull行,'poi_lng'列
  4. df.loc[poiLngNotNull, 'geohash'] = map(geo_hash, df.loc[poiLngNotNull,poi_lat], df.loc[poiLngNotNull, poi_lng]):loc()、map()、geo_hash()(见下面)函数的结合
    1. 取出经纬度,应用geo_hash函数,产生一个geohash,写到df新的列中
    2. 结果:df增加了一列,列名为geohash,其中每行的数据为每行对应的poilat、poilng通过python的geohash映射的值
  5. pd.get_dummies(df):将df中非数字类型的进行one-hot编码。参考: pandas使用get_dummies进行one-hot编码(题外PS:使用xgboost训练不好,One-hot编码适合LR、SVM之类的)
  6. 数据操作
    1. 读入数据
      1. df = pd.read_csv("fileName")
      2. df.columns = list('abcd')(读取无列名的时候,可用数组赋值)
    2. 打印数据
      1.  pandas.set_option('display.max_rows',None):参考Dataframe的数据print输出 显示为...省略号
    3. 取数据loc
      1. 参考:python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix
      2. 取出某列数据:df["columns_name"]、df.loc[:, "columns_name"](第一个参数表示所有行,第二个参数表示某列)
      3. 取出某些列数据:df[["columns_name1", "columns_name2"]]、df.loc[:,["columns_name1", "columns_name2"]]
      4. 取出第N行数据:df.loc[N, :]
      5. 取出第2-N、第N+2到M行的数据:df.loc[[2:N, N+2LM], :]
      6. 取出第2-N行、某两列的数据:df.loc[2:N, ["columns_name1", "columns_name2"]]
    4. iloc:若已知道columns_name是具体哪一列,可直接用数值代替。

    5. data.irow(0)
    6. data.icol(0)
    7. data.head()、data.head(10)
    8. data.tail()、data.tail(10)
    9. data.iat[1, 1]
  7. 聚合
    1. df = df.groupby(['date', 'hour', 'area_id']).agg({'temperature': 'mean', 'wind': 'mean', 'rain': 'mean'}).reset_index()
      1. 根据天、时、区域id进行聚合,统计温度、风、雨量的平均值,然后用reset_index()重置

二、小函数

  • 经纬度的计算
    • 计算两个经纬度之间的距离
      • 参考:http://blog.csdn.net/vernice/article/details/46581361
      • from math import radians, cos, sin, asin, sqrt  
          
        def haversine(lon1, lat1, lon2, lat2): # 经度1,纬度1,经度2,纬度2 (十进制度数)  
            """ 
            Calculate the great circle distance between two points  
            on the earth (specified in decimal degrees) 
            """  
            # 将十进制度数转化为弧度  
            lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])  
          
            # haversine公式  
            dlon = lon2 - lon1   
            dlat = lat2 - lat1   
            a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2  
            c = 2 * asin(sqrt(a))   
            r = 6371 # 地球平均半径,单位为公里  
            return c * r * 1000


  • geohash
      • import Geohash
        
        input_path = '../data'
        def geo_hash(lat, lng):
            if str(lat) == 'NaN' or str(lat) == 'nan' \
                    or str(lat) == '' or str(lng) == '' \
                    or str(lng) == 'nan' or str(lng) == 'NaN'\
                    or float(lat) <= 0 or float(lng) <= 0:
                return 'aaaaa'
            if float(lat) > 60.0 > float(lng):
                tmp = lat
                lat = lng
                lng = tmp
            # print Geohash.encode(float(lat), float(lng), 5)


  • log_unix_time时间转化
    • 参考:http://www.cnblogs.com/codemo/archive/2012/10/24/UnixTime.html
    • import sys
      import time
      
      def timeStamp_datatime(value):
          format = '%Y-%m-%d %H:%M:%S'
          #format = '%H'
          value = time.localtime(value)
      
          dt = time.strftime(format, value)
          return dt
      
      if __name__=="__main__":
          if len(sys.argv)<2:
              print "再输入一个unix_tim参数:"
          value = sys.argv[1]
          print  timeStamp_datatime(float(value))

  • 多级排序
    • 参考:http://blog.csdn.net/vernice/article/details/46384809
    • import sys, csv , operator  
      data = csv.reader(open('C:\test.csv'),delimiter=',')  
      sortedlist = sorted(data, key = lambda x: (x[0], int(x[1])))  
        
      with open("C:\result_test.csv", "wb") as f:  
          fileWriter = csv.writer(f, delimiter=',')  
          for row in sortedlist:  
              fileWriter.writerow(row)  
      f.close()  


三、时间处理合集

  1. datatime
    1. 参考:python datetime处理时间
    2. 实现日期的加减:from datetime import timedelta. 参考:python 使用datetime模块timedelta实现日期时间相加
    3. 时间戳转化:from datetime import *; date.fromtimestamp()
    4. string datetime互转
      1. str = '2012-11-19';date_time = datetime.datetime.strptime(str,'%Y-%m-%d')
      2. date_time.strftime('%Y-%m-%d');



猜你喜欢

转载自blog.csdn.net/u010454729/article/details/78326764