多条件应用迭代自身的函数
Multiple Condition Apply Function that iterates over itself
所以我有一个 Dataframe,它有 348 次相同的内容,但具有与静态列不同的日期。我想要做的是添加一个列来检查该日期,然后使用 lat/lon 列和 geopy 计算 20 英里内的行数。
我的框架是这样的:
我想要做的是类似于应用函数的东西,它采用等于该列的所有标识日期,然后 运行 这个:
geopy.distance.vincenty(x, y).miles
X 是位置的 lat/lon,y 是迭代的 lat/lon。我想要上面小于 20 的位置的计数。然后我想将此计数存储为初始 Dataframe 中的一列。
我对 Pandas 没问题,但这超出了我的舒适范围。谢谢
我从这个 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
所以我有一个 Dataframe,它有 348 次相同的内容,但具有与静态列不同的日期。我想要做的是添加一个列来检查该日期,然后使用 lat/lon 列和 geopy 计算 20 英里内的行数。
我的框架是这样的:
我想要做的是类似于应用函数的东西,它采用等于该列的所有标识日期,然后 运行 这个:
geopy.distance.vincenty(x, y).miles
X 是位置的 lat/lon,y 是迭代的 lat/lon。我想要上面小于 20 的位置的计数。然后我想将此计数存储为初始 Dataframe 中的一列。
我对 Pandas 没问题,但这超出了我的舒适范围。谢谢
我从这个 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