Python 熊猫:使用基于其他列值的函数有条件地填充列

Python 熊猫:使用基于其他列值的函数有条件地填充列,python,python-3.x,pandas,indexing,mask,Python,Python 3.x,Pandas,Indexing,Mask,我有一个包含两组坐标(lat1、lon1、lat2、lon2)的熊猫数据帧。我有一个使用这些坐标计算距离的函数。但数据帧中的某些行无效。我只想将函数应用于有效行,并将函数结果保存到“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;

我有一个包含两组坐标(lat1、lon1、lat2、lon2)的熊猫数据帧。我有一个使用这些坐标计算距离的函数。但数据帧中的某些行无效。我只想将函数应用于有效行,并将函数结果保存到“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\u dist,axis=1)
,但使用这种方法,我需要处理所有行,而不仅仅是匹配条件的行,并且需要在calculate\u dist函数中有一个if语句来忽略无效行。有更好的办法吗


我知道StackOverflow上已经出现了类似的问题,但我找不到任何同时使用函数和条件行选择的问题。

我认为您需要首先筛选:

样本:

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