#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})
Но мой результат был
Ожидаемый выход
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