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_lo
和 lon_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
s 分成两组 lo
和 up
第一组休息
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
重命名为 lo
和 up
final=result1.merge(result, left_index=True, right_index=True, suffixes=('_lo','_up'))
final
输出
我有以下数据框 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_lo
和 lon_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
s 分成两组 lo
和 up
第一组休息
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
重命名为 lo
和 up
final=result1.merge(result, left_index=True, right_index=True, suffixes=('_lo','_up'))
final
输出