遍历自身的多重条件应用功能

时间:2019-08-15 00:47:27

标签: python pandas geopy

因此,我有一个数据帧,它是348次相同的事件,但是作为静态列的日期不同。我想做的是添加一个根据该日期进行检查的列,然后使用经/纬度列和geopy计算20英里以内的行数。

我的框架是这样的:

enter image description here

我要执行的操作类似于应用函数,该函数接受与该列相同的所有标识日期,然后运行以下命令:

  

geopy.distance.vincenty(x,y).miles

X是位置的经纬度,而y是迭代的经纬度。我想要上面<20的位置计数。然后,我希望将此计数存储为初始Dataframe中的一列。


我对熊猫很满意,但是这超出了我的舒适范围。谢谢。

1 个答案:

答案 0 :(得分:0)

我从这个DataFrame开始(因为我不想手工输入那么多,并且您没有为数据提供任何代码):

df
   Index    Number        la                 ID 
0   0          1    [43.3948, -23.9483]     1/1/90
1   1          2    [22.8483, -34.3948]     1/1/90
2   2          3    [44.9584, -14.4938]     1/1/90
3   3          4    [22.39458, -55.34924]   1/1/90 
4   4          5    [33.9383, -23.4938]     1/1/90
5   5          6    [22.849, -34.397]       1/1/90

现在,我介绍了一个人造柱,该柱仅用于帮助我们获得距离的笛卡尔积

df['join'] = 1
df_c = pd.merge(df, df[['la', 'join','Index']], on='join')

下一步是通过vincenty应用.apply函数并将结果存储在额外的列中

df_c['distance'] = df_c.apply(lambda x: distance.vincenty(x.la_x, x.la_y).miles, 1)

现在,我们有了原始矩阵的笛卡尔乘积,这意味着我们也可以将每个城市与其自身进行比较。但是我们将在下一步中通过执行-1考虑到这一点。我们将Index_x分组,将所有距离相加小于20英里。

df['num_close_cities'] = df_c.groupby('Index_x').apply(lambda x: sum((x.distance < 20))) -1

df.drop('join', 1)

    Index   Number  la                      ID      num_close_cities
0   0         1     [43.3948, -23.9483]     1/1/90  0
1   1         2     [22.8483, -34.3948]     1/1/90  1
2   2         3     [44.9584, -14.4938]     1/1/90  0
3   3         4     [22.39458, -55.34924]   1/1/90  0
4   4         5     [33.9383, -23.4938]     1/1/90  0
5   5         6     [22.849, -34.397]       1/1/90  1