У меня есть сегментированные данные о дорогах, которые выглядят так:
import pandas as pd
input_df = pd.DataFrame({
'ROUTE': ['US9', 'US9', 'US9', 'US9', 'US9'],
'BMP': [0.0, 0.1, 0.2, 0.3, 0.4],
'EMP': [0.1, 0.2, 0.3, 0.4, 0.5],
'VALUE': [19, 19, 232, 232, 19]
})
>>> print(input_df)
BMP EMP ROUTE VALUE
0.0 0.1 US9 19
0.1 0.2 US9 19
0.2 0.3 US9 232
0.3 0.4 US9 232
0.4 0.5 US9 19
Столбец BMP представляет собой начальную милю этого атрибута на линейном представлении дороги в ГИС. EMP — это соответствующий конечный пробег. Когда столбец VALUE равен, я хотел бы объединить соседние сегменты.
Существует инструмент, который выполняет эту операцию в ArcGIS, который называется Растворить события маршрута. Я хотел бы использовать Pandas для выполнения этой задачи. Вот желаемый результат:
output_df = pd.DataFrame({
'ROUTE': ['US9', 'US9', 'US9'],
'BMP': [0.0, 0.2, 0.4],
'EMP': [0.2, 0.4, 0.5],
'VALUE': [19, 232, 19]
})
>>> print(output_df)
BMP EMP ROUTE VALUE
0.0 0.2 US9 19
0.2 0.4 US9 232
0.4 0.5 US9 19






Попробуй это!
input_df['trip'] = (input_df.VALUE.diff() != 0).cumsum()
output_df = input_df.groupby(['ROUTE','trip','VALUE']).agg({'BMP':'first','EMP':'last'})
output_df.reset_index()
#
ROUTE trip VALUE BMP EMP
0 US9 1 19 0.0 0.2
1 US9 2 232 0.2 0.4
2 US9 3 19 0.4 0.5
Спасибо за это! Это решение также работает с категориальными данными. Просто преобразуйте столбец значений в тип категории панд, используя
input_df['VALUE'].astype('category'). Тогда используйтеinput_df.VALUE.cat.codes.diff() != 0