pandas数据处理过程的收获
为什么要写这个?
因为我c语言写的太多了,写啥都是c语言的样子,导致了我操作dataframe洗超大数据的时候,就会特别特别慢。于是我根据这几次的失败经验总结出了以下的一些dataframe的基本操作。希望以后能够不要再犯错误然后找不到问题了。
两个dataframe的拼接。
a有以下列: loadingOrder, … , TRANSPORT_TRACE , … , endtime
b有以下列: trace , ave_time
其中trace和TRANSPORT_TRACE是对应的,现在需要把a,b对应的ave_time加入到a中。
ret = pd.DataFrame()
for i in range(len(data2)):
# 筛选条件
df = data1[(data1.TRANSPORT_TRACE == data2.loc[i]['trace'])]
df['ave_time'] = data2.loc[i]['ave_time']
# 使用 contact 进行上下连接, axis=0 表示多行连接
ret = pd.concat([ret, df], axis=0)
# 删除第一列因为 contact 产生的 index
ret = ret.reset_index(drop=True)
数据的计算与添加结果列 (矩阵运算速度 >> for循环)
数据格式:… , timestamp, speed, …
下一行与上一行的 timestamp 相减得到时间差, 再与 speed 相乘可以得到一段速度。
lat1 = data.latitude
lng1 = data.longitude
lat2 = lat1.shift(1)
lng2 = lng1.shift(1)
sum = np.sum(tool.distances(lat1, lat2, lng1, lng2))*1000
def distances(LatA, LatB, LonA, LonB):
EARTH_RADIUS = 6378.137 # 千米
def rad(d):
return d * np.pi / 180.0
s = 0
radLatA = rad(LatA)
radLatB = rad(LatB)
a = radLatA - radLatB
b = rad(LonA) - rad(LonB)
s = 2 * np.arcsin(
np.sqrt(np.power(np.sin(a / 2), 2) + np.cos(radLatA) * np.cos(radLatB) * np.power(np.sin(b / 2), 2)))
s = s * EARTH_RADIUS
# 保留两位小数
s = np.round(s * 100) / 100
# s = s * 1000 # 转换成m
return s
判断是不是string类型
def isString(obj):
try:
obj.lower() + obj.title() + obj + ""
except:
return False
else:
return True