Pandas:使用基于其他列值

时间:2016-12-30 08:47:06

标签: python python-3.x pandas indexing mask

我有一个Pandas DataFrame,它包含两组坐标(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_dist, axis=1)但是使用这种方法我需要处理所有行,而不仅仅是处理符合我条件的行,并且我需要在calculate_dist函数中有一个忽略无效行的if语句。还有更好的方法吗?

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

1 个答案:

答案 0 :(得分: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