Какой код я могу использовать в Python для преобразования 40000 строк значений широты и долготы (в радианах) в декартовы координаты? - PullRequest
1 голос
/ 11 июля 2019

В таблице ниже приведен пример данных, с которыми я работаю.

unimportant      latitude    longitude        lat         long
    a            52.927700    -3.243150     0.975123    -0.054621
    b            54.396837    -1.680645     0.959385    -0.029333
    c            52.902610    -1.473000     0.623323    -0.029691
    d            51.541824    0.081160      0.899576    0.000417
    e            51.073047    -0.423974     0.705355    -0.009382
                                  :
                                  :

У меня есть таблица с 5 столбцами и 40000 строк. 1 колонка не важна. Столбцы 2 и 3 показывают «долготу» и «широту» в градусах, а столбцы 4 и 5 показывают широту и долготу, названные «широта» и «долгота» в радианах. Мне было поручено добавить 3 новых столбца x, y, z, которые показывают декартовы координаты, основанные на 'lat' и 'long'. Я предполагаю, что z представляет высоту, но я не совсем уверен, как рассчитать это.

Как я могу вычислить x, y, z и добавить их в таблицу?

Я уже пытался использовать код, показанный в ответе на аналогичный вопрос на этом сайте, однако я получаю TypeError: должно быть действительным числом, а не ошибкой str.

def Cartesian_coordinates(lat,long):
    R = 6371
    x = R * math.cos(lat) * math.cos(long)
    y = R * math.cos(lat) * math.sin(long)
    z = R * math.sin(lat)
    return x,y,z

Вызов функции с помощью

Cartesian_coordinates('lat', 'long')

Только урожай

TypeError: must be real number, not str

Ответы [ 2 ]

2 голосов
/ 11 июля 2019
Cartesian_coordinates(df.latitude, df.longitude)

Вы должны поместить аргументы как значения, а не строки например:

'df.latitude' - this is string
df.latitude - this is value with type of df.latitude
0 голосов
/ 11 июля 2019

Вы ссылаетесь на Серии 'неправильно: должно быть - Cartesian_coordinates(df['lat'], df['long']).

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

import numpy as np
import pandas as pd

d = {'unimportant': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'},
     'lat': {0: 0.97512299999999996,  1: 0.95938500000000004,  2: 0.62332299999999996,  3: 0.89957600000000004,  4: 0.70535500000000007},
     'latitude': {0: 52.927700000000002,  1: 54.396836999999998,  2: 52.902609999999996,  3: 51.541823999999998,  4: 51.073046999999995},
     'long': {0: -0.054621000000000003,  1: -0.029332999999999998,  2: -0.029691000000000002,  3: 0.000417,  4: -0.0093819999999999997},
     'longitude': {0: -3.24315,  1: -1.6806450000000002,  2: -1.4730000000000001,  3: 0.081159999999999996,  4: -0.42397399999999996}      }

df = pd.DataFrame(d, columns=['unimportant','latitude','longitude','lat','long'])

def Cartesian_coordinates(lat, long):
    R = 6371
    x = R * np.cos(lat.values) * np.cos(long.values)
    y = R * np.cos(lat.values) * np.sin(long.values)
    z = R * np.sin(lat.values)
    return x,y,z

x,y,z = Cartesian_coordinates(df['lat'], df['long'])
df['x'],df['y'],df['z'] = x,y,z


In [38]: print(df[['x','y','z']])
             x           y            z
0  3569.222097 -195.148591  5273.728439
1  3655.531649 -107.258474  5216.821349
2  5170.610116 -153.565713  3718.985023
3  3962.392411    1.652318  4988.896135
4  4850.547744  -45.509174  4130.345808

In [39]: 

Индексирование и выбор данных

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