Pandas поиск нижнего и верхнего соседа в группе - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть следующий фрейм данных 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

1 Ответ

1 голос
/ 05 апреля 2020

Надеюсь, я правильно понял ваш вопрос. Смотрите мою попытку ниже. Сделано это долго, чтобы быть явным в моем подходе. Я мог бы легко ввести значение долготы 5,00 и нарезать его по индексу, но это затруднило бы ответить на часть 2 вашего вопроса. Если я что-то пропустил, дайте мне знать.

Данные

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

Добавьте вторую группу, указанную выше, к первой в один раз. Это отвечает на ваш вопрос 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

Переименуйте соседей в lon_lo и lon_up

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

Используя Поверните , разбейте информационный кадр на lon_lo и широту и сделайте то же самое с lon_up. Здесь рационально разбить latitude с на две группы 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')

Объединение по индексу двух групп при переименовании latitude s в lo и up

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

Вывод

enter image description here

...