Как я могу найти и извлечь определенное значение из кадра данных в Python? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть фрейм данных с именем "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: список индексов выходит за пределы

1 Ответ

0 голосов
/ 05 ноября 2019
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
    #--------below is revised---------
    mask = (oat.Name == name) & (oat.Age == age_plus_one)
    if sum(mask) == 0:
        new = None
    else:
        new = oat.loc[mask,'T'].tolist()[0]

    print(new)

Как вы упомянули, может не быть совпадений для (oat.Name == name) & (oat.Age == age_plus_one). Так что if-else поможет переключить регистр.

...