2016-12-30 1 views
2

私は、2組の座標(lat1、lon1、lat2、lon2)を含むPandas DataFrameを持っています。私はこれらの座標を使って距離を計算する関数を持っています。ただし、データフレームの行の一部が無効です。有効な行にのみ関数を適用し、関数の結果を 'dist'カラムに保存したいと考えています(カラムはデータフレーム内にすでに存在しています)。私はこのようなものが欲しいです:パンダ:条件付きで他の列の値に基づく関数を使用して列を塗りつぶします

UPDATE dataframe 
SET dist=calculate_dist(lat1, lon1, lat2, lon2) 
WHERE lat1 IS NOT NULL AND lat2 IS NOT NULL AND user_id>100; 

どうすればいいですか?

私はdf = df.apply(calculate_dist, axis=1)を使ってみましたが、この方法では条件に一致する行だけでなくすべての行を処理する必要があり、無効な行を無視するcalculate_dist関数内にif文を入れる必要があります。より良い方法がありますか?

私は既にStackOverflowに同様の質問が出ていることは知っていますが、関数と行の条件付き選択の両方を利用する質問は見つかりませんでした。

答えて

5

私は、あなたが最初にboolean indexingによってフィルタが必要だと思う:

mask = (df.lat1.notnull()) & (df.lat2.notnull()) & (df.user_id>100) 

df['dist'] = df[mask].apply(calculate_dist, axis=1) 

サンプル:

df = pd.DataFrame({'lat1':[1,2,np.nan,1], 
        'lon1':[4,5,6,2], 
        'lat2':[7,np.nan,9,3], 
        'lon2':[1,3,5,1], 
        'user_id':[200,30,60,50]}) 

print (df) 
    lat1 lat2 lon1 lon2 user_id 
0 1.0 7.0  4  1  200 
1 2.0 NaN  5  3  30 
2 NaN 9.0  6  5  60 
3 1.0 3.0  2  1  50 

#function returning Series 
def calculate_dist(x): 
    return x.lat2 - x.lat1 

mask = (df.lat1.notnull()) & (df.lat2.notnull()) & (df.user_id>100) 
df['dist'] = df[mask].apply(calculate_dist, axis=1) 
print (df) 
    lat1 lat2 lon1 lon2 user_id dist 
0 1.0 7.0  4  1  200 6.0 
1 2.0 NaN  5  3  30 NaN 
2 NaN 9.0  6  5  60 NaN 
3 1.0 3.0  2  1  50 NaN 
+0

それは動作しますが、よろしくお願いします。 – JustAC0der

関連する問題