Один из подходов к этому, при условии, что ввод чистый и правильный , будет использовать groupby
:
df = df.groupby('ID').apply(lambda x: pd.Series(x.values[0:2,2:4].flatten())) # (*)
df.columns=['X_1','Y_1','X_2','Y_2']
#df.reset_index() # Uncomment if you want 'ID' as a column and not an Index
Как и для других столбцовв желаемом результате: Anotation_1
и Anotation_2
всегда постоянны, поэтому я не стал их включать.Столбец Dist
- ну, вы можете вычислить его сейчас, учитывая новые столбцы, или вы можете изменить код выше, чтобы вычислять расстояние уже при обходе чисел на шаге (*)
выше, тем самым изменив наш код на что-то вроде: (здесь используется расчет фиктивного расстояния, замените его своим!)
def my_func(pdf):
return pd.Series([pdf.values[0,2], pdf.values[0,3], pdf.values[1,2], pdf.values[1,3],
np.sqrt((pdf.values[0,2]-pdf.values[1,2])**2+(pdf.values[0,3]-pdf.values[1,3])**2) # <= your distance calculation goes here...
])
df = df.groupby('ID').apply(my_func)
df.columns=['X_1','Y_1','X_2','Y_2','Dist']
#df.reset_index() # Uncomment if you want 'ID' as a column and not an Index
Обновление: если вы настаиваете на включении этих константных столбцов, вы можете просто добавить их позже, например, так: (но почему бы вам? особенно если это большой DataFrame
... )
df['Annotation_1'] = 'Boarding'
df['Annotation_2'] = 'Alighting'
# And if you further insist on a specific ordering of the columns, you can go with:
df = df[['Annotation_1', 'X_1', 'Y_1', 'Annotation_2', 'X_2', 'Y_2', 'Dist']]