preface:最近在整内比赛MDD。遇到一些数据处理方面的事情,用python pandas是最为方便的,远比我想象的强大。几行代码就完成了数据的处理,多个文件的融合,再用sklearn里面的模型跑一跑,就能得到结果。为此,经常记录下来,对数据处理的应用。
一、Pandas合集
- df = pd.read_csv('%s/%s' % (input_path, file_name)):read_csv()读入文件函数,文件以tab隔开则read_csv(fileName, sep="\t")。分两个变量:input_path和file_name传入更佳。
- poiLngNotNull = pd.notnull(df["poi_lng"]):notnull()筛选函数。数据预处理:取列名为poi_lng不为空的行。
- df.loc[poiLngNotNull, 'poi_lng']:loc()函数。定位到poiLngNotNull行,'poi_lng'列
- df.loc[poiLngNotNull, 'geohash'] = map(geo_hash, df.loc[poiLngNotNull,poi_lat], df.loc[poiLngNotNull, poi_lng]):loc()、map()、geo_hash()(见下面)函数的结合
- 取出经纬度,应用geo_hash函数,产生一个geohash,写到df新的列中
- 结果:df增加了一列,列名为geohash,其中每行的数据为每行对应的poilat、poilng通过python的geohash映射的值
- pd.get_dummies(df):将df中非数字类型的进行one-hot编码。参考: pandas使用get_dummies进行one-hot编码(题外PS:使用xgboost训练不好,One-hot编码适合LR、SVM之类的)
- 数据操作
- 读入数据
- df = pd.read_csv("fileName")
- df.columns = list('abcd')(读取无列名的时候,可用数组赋值)
- 打印数据
- pandas.set_option('display.max_rows',None):
- 取数据loc
- 参考:python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix
- 取出某列数据:df["columns_name"]、df.loc[:, "columns_name"](第一个参数表示所有行,第二个参数表示某列)
- 取出某些列数据:df[["columns_name1", "columns_name2"]]、df.loc[:,["columns_name1", "columns_name2"]]
- 取出第N行数据:df.loc[N, :]
- 取出第2-N、第N+2到M行的数据:df.loc[[2:N, N+2LM], :]
- 取出第2-N行、某两列的数据:df.loc[2:N, ["columns_name1", "columns_name2"]]
- iloc:若已知道columns_name是具体哪一列,可直接用数值代替。
- data.irow(0)
- data.icol(0)
- data.head()、data.head(10)
- data.tail()、data.tail(10)
- data.iat[1, 1]
- 聚合
- df = df.groupby(['date', 'hour', 'area_id']).agg({'temperature': 'mean', 'wind': 'mean', 'rain': 'mean'}).reset_index()
- 根据天、时、区域id进行聚合,统计温度、风、雨量的平均值,然后用reset_index()重置
二、小函数
经纬度的计算
- 计算两个经纬度之间的距离
- 参考:
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时间转化
- 参考:
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))
多级排序
- 参考:
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()
三、时间处理合集
- datatime
- 参考:python datetime处理时间
- 实现日期的加减:from datetime import timedelta.
- 时间戳转化:from datetime import *; date.fromtimestamp()
- string datetime互转
- str = '2012-11-19';date_time = datetime.datetime.strptime(str,'%Y-%m-%d')
- date_time.strftime('%Y-%m-%d');