Pandas:使用基于其他列值的函数有条件地填充列
Pandas: Conditionally fill column using a function based on other columns values
我有一个 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 语句忽略无效行。有没有更好的方法?
我知道类似的问题已经出现在 Whosebug 上,但我找不到任何同时使用行的函数和条件选择的问题。
我认为您需要先按 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
我有一个 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 语句忽略无效行。有没有更好的方法?
我知道类似的问题已经出现在 Whosebug 上,但我找不到任何同时使用行的函数和条件选择的问题。
我认为您需要先按 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