繁体   English   中英

Groupby 并应用定义的函数 - Pandas

[英]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

我想通过按IDDate对 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM