#python #pandas
Вопрос:
Я использую вложенный цикл for для вычисления расстояния примерно для 20 точек, используя следующий скрипт:
df = pd.read_csv('LOC.txt',sep='t',header=None)
lat=df[0]*((22/7)/180)
lon=df[1]*((22/7)/180)
R=6371
dis=[]
lat1 = 33.17*(22/7)/180
lon1 = 73.98*(22/7)/180
for lat2, lon2 in [df[0], df[1]]:
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
u = R * c
dis.append(float(u))
df_hr = pd.DataFrame(dis)
print(df_hr)
Но, это дает мне эту ошибку для этой строки:
---> 14 for lat2, lon2 in [df[0], df[1]]:
Ошибка значения: слишком много значений для распаковки (ожидается 2)
Может кто-нибудь подскажет мне, как я могу это решить
Комментарии:
1. Добавьте дополнительную обратную связь, в какой строке вы получаете эту ошибку.
2. —> 14 для lat2, lon2 в [df[0], df[1]]:
3. Похоже, у вас неверные строки в loc.txt (строки, которые имеют только одно значение, где ожидается два)
4. Я тщательно проверил свои данные, в каждой строке есть две точки данных
5.
print(df.shape, df[0], df[1])
; добавьте несколько строк из LOC.txt чтобы ваша проблема могла быть воспроизведена
Ответ №1:
Вы не можете выполнять итерацию двух элементов в списке одновременно с in
помощью оператора напрямую. Это ожидается,
---> 14 for lat2, lon2 in [df[0], df[1]]:
Используйте этот способ для одновременного перебора двух элементов в списке,
li = ["a", "b"]
for a, b in zip(*[iter(li)]*2):
print(a,b)
Выход:
a b
Для вашего случая,
df = pd.read_csv('LOC.txt',sep='t',header=None)
lat=df[0]*((22/7)/180)
lon=df[1]*((22/7)/180)
R=6371
dis=[]
lat1 = 33.17*(22/7)/180
lon1 = 73.98*(22/7)/180
location = [df[0], df[1]]
for lat2, lon2 in zip(*[iter(location)]*2):
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
u = R * c
dis.append(float(u))
df_hr = pd.DataFrame(dis)
print(df_hr)
Ответ №2:
Спасибо за помощь, я наконец-то нашел способ решить эту проблему:
Вот сценарий для чужой ссылки:
df = pd.read_csv('LOC.txt',sep='t',header=None)
lat=df[0]*((22/7)/180)
lon=df[1]*((22/7)/180)
R=6371
dis=[]
lat1 = 33.17*(22/7)/180
lon1 = 73.98*(22/7)/180
for lat2, lon2 in zip (df[0]*(22/7)/180, df[1]*(22/7)/180):
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat / 2)**2 cos(lat1) * cos(lat2) * sin(dlon / 2)**2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
u = R * c
dis.append(float(u))
df_hr = pd.DataFrame(dis)
print(df_hr)