2016-12-30 99 views
2

我有一個包含兩組座標(lat1,lon1,lat2,lon2)的Pandas DataFrame。我有一個使用這些座標計算距離的函數。但是數據框中的一些行是無效的。我想僅將我的函數應用於有效行並將函數的結果保存到'dist'列(該列已存在於數據框中)。我想要這樣的SQL:熊貓:使用基於其他列值的函數有條件填充列

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

相關問題