【问题标题】:Multiple Condition Apply Function that iterates over itself迭代自身的多个条件应用函数
【发布时间】:2019-08-15 00:47:27
【问题描述】:

所以我有一个数据框,它是同一件事 348 次,但作为静态列的日期不同。我想做的是添加一个列来检查该日期,然后使用 lat/lon 列和 geopy 计算 20 英里内的行数。

我的框架是这样的:

我想做的是类似于 apply 函数,它获取所有与列相同的标识日期,然后运行:

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

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


我对 Pandas 没问题,但这超出了我的舒适区。谢谢。

【问题讨论】:

  • 我在这里做了类似的事情:stackoverflow.com/a/57284181/9534390
  • 所以我可以这样做。这是我真正苦苦挣扎的第一部分,我想要计数......而不是绝对距离。

标签: python pandas geopy


【解决方案1】:

我从这个 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')

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

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

【讨论】:

    猜你喜欢
    • 2019-10-06
    • 2017-01-13
    • 2011-05-25
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多