2016-06-27 5 views
0

mx+bで定義された行があります。m,bnp.linalg.lstsqから取得された変数です。関数出力に基づく条件に一致するpandas行だけを一覧表示する

はまたように規定された距離と呼ばれる関数作成した:私はのようにベクトル形式を作成している便宜上

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])

Iが含まspiralと呼ばれるパンダ配列を有します不規則な螺旋の上にポイントの束。このパンダのデータフレームには、spiral.t , spiral.x, spiral.yという3つのフィールドがあり、tは時間とともに増加し、x,yはデカルト平面上の螺旋の座標(矩形座標)です。

したがって、spiral.x,spiral.yの各ペアには、対応者spiral.tがあります。

私は列全体を持っspiral.xを呼び出すパンダのデータフレームであるので、私は簡単

distance(spiral.x, spiral.y, m, b)

で開始上に定義され、その行に螺旋上の各点からの距離を計算することができます。そこに私はした:

x0 = np.array(spiral.x) 
y0 = np.array(spiral.y) 

dist=vdistance(x0,y0,m,b) 

私はすべての距離でnp.array distを持っています。

私はスパイラルを反復処理することができます近くのすべての値について
near = np.where(dist <= 250) 

そして今:それで私はKがラインに十分に近く、私には合理的な距離であるindexes <= K、(この場合は250で)を得ることができます正しいtを取得します。 (なぜなら、tは同じ割合で成長しないからです)。

ts=[] 
for i in near: 
    ts += [ spiral.t[i] ] 

私の質問は、パンダのワンショットでこれをどうやって行うのですか?

答えて

1

df.apply()を使用すると、行に対して反復処理を行い、関数に対して複数の列にアクセスできます。 = 1ここで

df[df.apply(distance, axis=1)]

軸が行を反復処理するために適用されます伝えます。 df.apply()は、axis = 0の場合に列に対して反復処理を行います。このステートメントの結果は、より少ない行数を持つdfのサブセットであるデータフレームです。

この作業を行うには、distance関数がブール値を返す必要があります。この関数のロジックは次のようになります。

+0

玉I.がパンダ認識している 'distance'関数を作成した

def distance(row): dist = compute_dist(row['x'], row['y']) if dist < 250: return True return False 
'その戻りABS(傾斜*行[「X」] - 行[「Y」] + yintercept )/(勾配** 2 + 1)**。これで私は今、 'spiral ['distance'] = spiral.apply(distance、args =(m、b)、axis = 1)'と呼んでいます。私は非常に古いバージョンのpandas(0.8.0)を実行しているので(私は更新できません)。 where節を実行する方法を探しています。なぜならpandas 0.8.0ではどこに実装されていないからですか。 – Lin

+0

私は 'spiral ['distance'] <250'を走らせることができ、それは私に' pandas 'を返します。Series 'を 'index Bool'と一緒に使用していますが、' pandas.DataFrame.loc'も '0.8.0'では実装されていないので、既存のデータフレームにどのように適用するのか分かりません。 – Lin

+0

'spiral [spiral.distance <250]'は、私に必要なデータの "ビュー"を返します。 – Lin

関連する問題