У меня есть фрейм данных с именем "oat" - вот его фрагмент:
Name Age Year T Neigh One Neigh Two
0 Carl P 31 1998 0.1 5454 657
1 Tyler A 26 2012 3.9 578 98
2 Antoine G 20 1997 1.7 17 9878
3 Travis A 23 2008 3.2 199 398
4 Geoff H 22 1980 -0.3 901 7650
5 David C 28 2014 4.5 8001 72
6 Antoine G 21 1998 2.3 5678 9800
7 Tyler A 25 2011 3.1 2245 450
Я пытаюсь запустить цикл for для каждой строки. Значения в столбце «Neigh One» относятся к индексу другой строки, из которой, основываясь на определенных переменных, приведут к другой строке, из которой я хотел бы извлечь переменную.
Вот что я пробовал:
for index, row in oat.iterrows():
indice = row['Neigh One']
name = oat.iloc[indice]["Name"]
age = oat.iloc[indice]["Age"]
age_plus_one = age + 1
new = oat.loc[(oat.Name == name) & (oat.Age == age_plus_one),'T'].tolist()[0]
print(new)
Я получаю сообщение об ошибке из последней переменной, которую я пробую, "new". По сути, я перебираю каждую строку, и, основываясь на значении «Neigh One», он идет к этому индексу, извлекает имя и возраст, а затем добавляет 1. Оттуда я ищу новую строку с тем же самымимя, но с одним добавленным к возрасту.
Примечание: этому может соответствовать либо ноль строк, либо только одна строка. Было бы невозможно иметь более одного матча.
Все, что я хочу сделать, это для каждого цикла просто возвращать значение 'T', которое возвращается на основе моего логического фильтра.
Я также попробовал следующее для последней переменной с сообщениями об ошибках, которые каждое из них возвращает:
new= oat[(oat['Name'] == name) & (oat['Age'] == age_plus_one)].T.item()
ValueError: можно преобразовать только массив размера 1 в скаляр Python
new = oat[(oat['Name'] == name) & (oat['Age'] == age_plus_one),'T'].values[0]
не ошибка, но возвращает булевский список True of False для всего фрейма данных, а не для фактических значений.
new = oat.loc[(oat.Name == name) & (oat['Age'] == age_plus_one),'T'].values[0]
IndexError: индекс 0 выходит за границы оси 0 с размером 0
new = oat.loc[(oat.name == name) & (oat.Age == age_plus_one),'T'].tolist()[0]
IndexError: список индексов выходит за пределы