我有mx+b
定义的行,其中m,b
是从np.linalg.lstsq
获取的变量。
还创建了一个名为distance的函数,定义为:
def distance(x0, y0, slope, yintercept):
"""Returns the euclidean distance between a line and
a point"""
return abs(slope*x0-y0+yintercept)/(slope**2+1)**.5
为方便起见,我创建了一个矢量化形式,如:
vdistance = np.vectorize(distance,otypes=[np.float])
我有一个名为spiral
的pandas数组,它包含一堆不规则螺旋上的点。此pandas数据框有三个字段(其中包括):spiral.t , spiral.x, spiral.y
,其中t
是时间上的增加值,x,y
是笛卡尔平面上的螺旋坐标(rect坐标)。< / p>
因此,对于每个spiral.x,spiral.y
对,我都有一个通讯员spiral.t
。
我可以很容易地计算从螺旋上的每个点到开始时用
定义的那条线的距离 distance(spiral.x, spiral.y, m, b)
由于是pandas数据帧,当我调用spiral.x
时,我得到了整个列。因此,我做了:
x0 = np.array(spiral.x)
y0 = np.array(spiral.y)
dist=vdistance(x0,y0,m,b)
我有一个np.array dist
所有距离。有了这个,我可以得到indexes <= K
,其中K
对我来说是一个合理的距离,接近线(在这种情况下为250)与:
near = np.where(dist <= 250)
现在,对于近处的每个值,我都可以迭代螺旋检索正确的t
s。 (因为t不会以相同的速率增长)。
ts=[]
for i in near:
ts += [ spiral.t[i] ]
我的问题是如何用熊猫一次拍摄?
答案 0 :(得分:1)
您可以使用df.apply()迭代行并访问函数的多个列。
df[df.apply(distance, axis=1)]
axis = 1这里告诉apply迭代行。如果axis = 0,df.apply()将迭代列。此语句的结果是一个数据帧,它是df
的子集,行数较少。
要使这项工作,您的distance
函数应该返回一个布尔值。这个函数的逻辑可能是:
def distance(row):
dist = compute_dist(row['x'], row['y'])
if dist < 250:
return True
return False