仅列出与基于函数输出的条件匹配的pandas行

时间:2016-06-27 23:30:43

标签: python numpy pandas

我有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] ]

我的问题是如何用熊猫一次拍摄?

1 个答案:

答案 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