[英]Groupby and apply a defined function - Pandas
我有这个 df:
ID Date Time Lat Lon Time_1 Lat_1 Lon_1
A 07/16/2019 08:00 29.39291 -98.50925 09:00 29.39923 -98.51256
A 07/16/2019 09:00 29.39923 -98.51256 10:00 29.40147 -98.51123
A 07/16/2019 10:00 29.40147 -98.51123 10:00 29.40147 -98.51123
A 07/18/2019 08:30 29.38752 -98.52372 09:30 29.39291 -98.50925
A 07/18/2019 09:30 29.39291 -98.50925 09:30 29.39291 -98.50925
B 07/16/2019 08:00 29.39537 -98.50402 08:00 29.39537 -98.50402
B 07/18/2019 11:00 29.39343 -98.49707 12:00 29.39291 -98.50925
B 07/18/2019 12:00 29.39291 -98.50925 12:00 29.39291 -98.50925
B 07/19/2019 10:00 29.39556 -98.53148 10:00 29.39556 -98.53148
我想通过按ID
和Date
对 df 进行分组来创建"Distance"
列,并应用定义的函数。
我写的代码:
def grp_crossarc(f):
for i in range(len(f)):
f.loc[i,'Distance'] = crossarc(f.iloc[i]['Lat'],f.iloc[i]['Lon'],
f.iloc[i]['Lat_1'],f.iloc[i]['Lat_1'],
29.39537,-98.50402)
return f
df.groupby(['ID','Date'],as_index=False).apply(grp_crossarc)
crossarc
是另一个定义的函数,它有 6 个参数(3 个经纬度点)。
我得到的结果:
ID Date Time Lat Lon Time_1 Lat_1 Lon_1 Distance
A 07/16/2019 08:00 29.39291 -98.50925 09:00 29.39923 -98.51256 0.166057
A 07/16/2019 09:00 29.39923 -98.51256 10:00 29.40147 -98.51123 0.889147
A 07/16/2019 10:00 29.40147 -98.51123 10:00 29.40147 -98.51123 0.973550
A 07/18/2019 08:30 29.38752 -98.52372 09:30 29.39291 -98.50925 NaN
A 07/18/2019 09:30 29.39291 -98.50925 09:30 29.39291 -98.50925 NaN
NaN NaN NaN NaN NaN NaN NaN NaN 0.736501
NaN NaN NaN NaN NaN NaN NaN NaN 0.165974
B 07/16/2019 08:00 29.39537 -98.50402 08:00 29.39537 -98.50402 NaN
NaN NaN NaN NaN NaN NaN NaN NaN 0.000000
B 07/18/2019 11:00 29.39343 -98.49707 12:00 29.39291 -98.50925 NaN
B 07/18/2019 12:00 29.39291 -98.50925 12:00 29.39291 -98.50925 NaN
NaN NaN NaN NaN NaN NaN NaN NaN 0.707027
NaN NaN NaN NaN NaN NaN NaN NaN 0.165974
B 07/19/2019 10:00 29.39556 -98.53148 10:00 29.39556 -98.53148 NaN
NaN NaN NaN NaN NaN NaN NaN NaN 1.900238
对于少数(ID, Date)
对,距离值向前移动了一行,因此创建了 NaN 值。 如何解决?
您可以尝试使用 lambda 函数代替循环:
def grp_crossarc(f):
f['Distance'] = (f.apply(lambda x: crossarc(x['Lat'],x['Lon'],
x['Lat_1'],x['Lat_1'],
29.39537,-98.50402), axis=1))
return f
df = df.groupby(['ID','Date'],as_index=False).apply(grp_crossarc)
但似乎函数不依赖于组,所以应该简化为 omit groupby.apply
:
df['Distance'] = (df.apply(lambda x: crossarc(x['Lat'],x['Lon'],
x['Lat_1'],x['Lat_1'],
29.39537,-98.50402), axis=1))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.