Слишком много значений для распаковки Ошибки для цикла nuested for?

#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)