Вычисление расстояния по паре для каждого экземпляра с использованием цикла for

#python #pandas #dataframe #for-loop

Вопрос:

У меня есть фрейм данных, который выглядит так

мой фрейм данных

Я хотел создать новый фрейм данных с парными расстояниями для каждого экземпляра, используя цикл for. Я использовал следующий код для создания парного расстояния

 list=[]            
list2=[]            
list3=[]                
for i in df.index:   
    for j in df.index:             
        list.append(i)             
        list2.append(j)               
        
for z in range(0,5):
    for y in range(0,5):
        list3.append(distance.jaccard(df.iloc[z],df.iloc[y]))


Se=pd.Series(list)
Se2=pd.Series(list2)
Se3=pd.Series(list3)
df1=pd.DataFrame({'A':Se,'B':Se2,'Distance':Se3})
 

Но мой результат был

new_dataframe

Ожидаемый выход

 A-B-Distance                    
Instance_0 - Instance_1- 0.5           
Instance_0 - Instance_2 - 0.0         
Instance_0 - Insatnce_3 - 0.5       
Instance_0 - Instance_4 -0.5       
Instance_1 - Instance_2 - 0.5       
Instance_1 - Instance_3 - 0.0          
Insatnce_1 - Instance_4 - 1.0          
Instance_2 - Instance_3 - 0.5            
Instance_2 - Instance_4 - 0.5           
instance_3 - Instance_4 - 1.0       
    
 

Комментарии:

1. всегда указывайте код, данные и полное сообщение об ошибке в виде текста (не скриншот, не ссылка) в вопросе (не в комментарии).

2. вы должны описать разницу между вашим результатом и ожидаемым результатом. Выходные данные длинные, и мы можем не видеть разницы — и мы не можем читать в ваших мыслях.

3. для обычного списка ему нужно было бы использовать первый индекс во втором for цикле- for ... in range(first_index, n) вместо for ... in range(n) — и это должно пропускать пары, например (1,0) , потому что у вас уже есть пара (0,1)

Ответ №1:

Если я понимаю разницу между выходами, вы хотите пропустить такие пары, (a,a) а также сохранить (a,b) , но удалить (b,a)

Просто во втором for цикле вы должны использовать range(z 1, 5) вместо range(0, 5)

 for z in range(0, 5):
    for y in range(z 1, 5):
        print(z, y)
 

Результат:

 0 1
0 2
0 3
0 4
1 2
1 3
1 4
2 3
2 4
3 4