熊猫搜索组内的上下邻居

问题描述 投票:0回答:1

我有以下数据框df,它为特定组号指定纬度和经度:

      latitude   longitude   group
0    51.822231   4.700267    1
1    51.822617   4.801417    1
2    51.823235   4.903300    1
3    51.823433   5.003917    1
4    51.823616   5.504467    1
5    51.822231   3.900267    2
6    51.822617   3.901417    2
7    51.823235   3.903300    2
8    51.823433   6.903917    2
9    51.823616   8.904467    2
10   51.822231   1.900267    3
11   51.822617   2.901417    3
12   51.823235   11.903300   3
13   51.823433   12.903917   3
14   51.823616   13.904467   3

在每个组号中,我尝试查找指定值longitude_value = 5.00的'经度'列的上下邻居。每个组“行程”中的所有经度均以df排序(它们在每个组中上升)]

每行我希望上下经度值为5.000000。所需的输出看起来像:

      latitude   longitude   trip
2    51.823235   4.903300    1
3    51.823433   5.003917    1
7    51.823235   3.903300    2
8    51.823433   6.903917    2
11   51.822617   2.901417    3
12   51.823235   11.903300   3

根据这个结果,我想将数据重新排列为:

     lat_lo     lat_up        lon_lo     lon_up  
0    51.823235  51.823433     4.903300   5.003917            
1    51.823235  51.823433     3.903300   6.903917        
2    51.822617  51.823235     2.901417   11.903300
pandas group-by nearest-neighbor
1个回答
0
投票

请在下面查看我的尝试。在我的方法中很明确。我可以很容易地引入经度值5.00并在索引上切片,但这将使回答问题的第2部分变得复杂。凭借17年的空间工作经验,我迷失了为什么您需要问题第二部分中的结果。请在下面查看我的尝试。

数据

df=pd.read_clipboard()
df

enter image description here

输入点并计算经度差

fn=5.00
df['dif']=(df['longitude']-fn)
df

找出每组中的最小正差异

df1=df[df['dif'] > 0].groupby('group').min().reset_index().reindex()

找出每组中的最小负差异

df2=df[df['dif'] < 0].groupby('group').min().reset_index().reindex()

Append上面的第二个组到第一个成一个df。 这将回答您的问题1

df3=df1.append(df2, ignore_index=True).sort_values(['group','longitude'])
df3

问题2

引入名为status的列并附加一个模式,3代表下一个邻居,4代表上一个邻居

df3['Status']=0
np.put(df3['Status'], np.arange(len(df3)), ['3','4'])
df3.drop(columns=['dif'], inplace=True)
df3

[Renamelon_lolon_up的邻居

df3['Status']=np.where(df3['Status']==3,'lon_lo', (np.where(df3['Status']==4,'lon_up',df3['Status'] )))

使用pivot,将数据帧分为lon_lo和纬度,然后对lon_up进行相同处理。合理的做法是将latitude分为两组loup

第一小组休息

df4=df3[df3['Status']=='lon_lo']
result=df4.pivot_table('longitude',['latitude','group'],'Status').reset_index().set_index('group')

第二小组休息

df4=df3[df3['Status']=='lon_up']
result1=df4.pivot_table('longitude',['latitude','group'],'Status').reset_index().set_index('group')

[Merge on index这两个组,同时将latitude重命名为loup

final=result1.merge(result, left_index=True, right_index=True, suffixes=('_lo','_up'))
final

输出enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.