Pandas 搜索组内上下邻居

Pandas search lower and upper neighbour within group

我有以下数据框 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 找到列 'longitude' 的下邻域和上邻域。每个组 'trips' 中的所有经度都按 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

希望我答对了你的问题。请参阅下面的尝试。在我的方法中明确说明很长时间。我可以很容易地引入 5.00 的经度值并在索引上切片,但这会使回答问题的第 2 部分变得复杂。如果我错过了什么,请告诉我。

数据

df=pd.read_clipboard()
df

输入点并计算经度差

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').max().reset_index().reindex()

Append第二组上面给第一个进一个df。 这回答了您的问题 1

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

问题二

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

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

Rename lon_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 执行相同的操作。这里的合理性是将 latitudes 分成两组 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

输出