Применить функцию к наборам столбцов в пандах, «зацикливаясь» по всему фрейму данных по столбцам
Вот тестовый пример, чтобы показать, чего я пытаюсь достичь. Вот'игрушечный фрейм данных:
df = pd.DataFrame(np.random.randn(10,7),index=range(1,11),columns=headers)
Который дает
Time A_x A_y A_z B_x B_y B_z
1 -0.075509 -0.123527 -0.547239 -0.453707 -0.969796 0.248761 1.369613
2 -0.206369 -0.112098 -1.122609 0.218538 -0.878985 0.566872 -1.048862
3 -0.194552 0.818276 -1.563931 0.097377 1.641384 -0.766217 -1.482096
4 0.502731 0.766515 -0.650482 -0.087203 -0.089075 0.443969 0.354747
5 1.411380 -2.419204 -0.882383 0.005204 -0.204358 -0.999242 -0.395236
6 1.036695 1.115630 0.081825 -1.038442 0.515798 -0.060016 2.669702
7 0.392943 0.226386 0.039879 0.732611 -0.073447 1.164285 1.034357
8 -1.253264 0.389148 0.158289 0.440282 -1.195860 0.872064 0.906377
9 -0.133580 -0.308314 -0.839347 -0.517989 0.652120 0.477232 -0.391767
10 0.623841 0.473552 0.059428 0.726088 -0.593291 -3.186297 -0.846863
Что я хочу сделать, это просто рассчитать длину вектора для каждого заголовка (A и B) в этом случае для каждого индекса, и разделить наTime
колонка. Следовательно, эта функция должна бытьnp.sqrt(A_x^2 + A_y^2 + A_z^2)
и то же самое для B, конечно. То есть Я рассчитываю рассчитать скорость для каждой строки, но три столбца влияют на один результат скорости.
Я пытался использоватьdf.groupby
а такжеdf.filter
зацикливать столбцы, но я не могу заставить его работать, потому что я совсем не уверен, как эффективно применять одну и ту же функцию к фрагментам фрейма данных, все за один раз (так как, по-видимому, нужно избегать зацикливания). строки). Я пытался делать
df = df.apply(lambda x: np.sqrt(x.dot(x)), axis=1)
Это работает, конечно, но только в том случае, если во входном фрейме данных есть правильное количество столбцов (3), если оно длиннее, чем произведение точек на всю строку, а не на куски из трех столбцов, что я и хочу (потому что это повороты соответствуют координатам тега, которые являются трехмерными).
Вот что я в итоге пытаюсь получить с помощью приведенного выше примера (приведенные ниже массивы просто заполнены случайными числами, а не фактическими скоростями, которые я пытаюсь вычислить - просто чтобы показать, какую форму я пытаюсь достичь):
Velocity_A Velocity_B
1 -0.975633 -2.669544
2 0.766405 -0.264904
3 0.425481 -0.429894
4 -0.437316 0.954006
5 1.073352 -1.475964
6 -0.647534 0.937035
7 0.082517 0.438112
8 -0.387111 -1.417930
9 -0.111011 1.068530
10 0.451979 -0.053333
Мои фактические данные - 50 000 x 36 (поэтому есть 12 тегов с координатами x, y, z), и я хочу рассчитать скорость всего за один раз, чтобы избежать итерации (если это вообще возможно). Существует также столбец времени той же длины (50000x1).
Как ты это делаешь?
Спасибо, астрид