2016-12-30 2 views
2

У меня есть DataFrame Pandas, который содержит два набора координат (lat1, lon1, lat2, lon2). У меня есть функция, которая вычисляет расстояние, используя эти координаты. Но некоторые из строк в фрейме данных недействительны. Я хотел бы применить свою функцию только к допустимым строкам и сохранить результат функции в столбце «dist» (столбец уже существует в фрейме данных). Я хочу что-то вроде этого SQL:Pandas: Условно заполнить столбец, используя функцию, основанную на других значениях столбцов

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), но при таком подходе мне нужно обработать все строки, а не только строки, соответствующие моим условиям, и мне нужно иметь оператор if внутри функции calculate_dist, который игнорирует недопустимые строки. Есть ли способ лучше?

Я знаю, что подобные вопросы уже появились в 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