Эффективно выполняйте итерации pandas.DataFrame, одновременно обращаясь к нескольким индексным строкам - PullRequest
0 голосов
/ 26 ноября 2018

Я уже прочитал ответы и записи в блоге о том, как выполнить итерацию pandas.DataFrame (https://engineering.upside.com/a-beginners-guide-to-optimizing-pandas-code-for-speed-c09ef2c6a4d6),, но у меня все еще остается один вопрос.

В настоящее время мой DataFrame представляет собой траекторию GPS, содержащую столбцы время, долгота и широта . Теперь я хочу вычислить функцию, называемую расстояние до следующей точки . Поэтому мне нужно не только перебирать строки и выполнять операции надотдельные строки, но для доступа к последующим строкам за одну итерацию.

i=0
for index, row in df.iterrows():
    if i < len(df)-1:
        distance = calculate_distance([row['latitude'],row['longitude']],[df.loc[i+1,'latitude'],df.loc[i+1,'longitude']])
        row['distance'] = distance

Помимо этой проблемы, у меня возникает та же проблема при расчете скорости, применении сглаживания или других подобных методов.

Другой пример: я хочу искать точки данных со скоростью == 0 м / с, и исходя из этих точек, я хочу добавить все последующие точки данных в массив, пока скорость не достигнет 10 м / с (чтобы найти сегменты ускорения от 0 м / сдо 10 м / с).

Есть ли у вас какие-либо предложения о том, как кодировать подобные вещи настолько эффективно, насколько это возможно?

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете использовать pd.DataFrame.shift для добавления сдвинутых рядов к вашему фрейму данных, а затем вводить их в вашу функцию через apply:

def calculate_distance(row):
    # your function goes here, trivial function used for demonstration
    return sum(row[i] for i in df.columns)

df[['next_latitude', 'next_longitude']] = df[['latitude', 'longitude']].shift(-1)
df.loc[df.index[:-1], 'distance'] = df.iloc[:-1].apply(calculate_distance, axis=1)

print(df)

   latitude  longitude  next_latitude  next_longitude  distance
0         1          5            2.0             6.0      14.0
1         2          6            3.0             7.0      18.0
2         3          7            4.0             8.0      22.0
3         4          8            NaN             NaN       NaN

Это работаетдля произвольной функции calculate_distance, но есть вероятность, что ваш алгоритм является векторным, и в этом случае вам следует использовать методы Pandas / NumPy по столбцам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...