'Finding the line number of specific values in pandas dataframe - python

I am working on a school project and I am trying to simulate a library's catalogue system. I have .csv files that hold all the data I need but I am having a problem with checking if an inputted title, author, bar code, etc. is in the data set. I have searched around for quite a while trying different solutions but nothing is working. The idea that I have right now is that if I can find at what line the inputted data, then I can use .loc[] to get the needed info. Is this the right track? is there another, more efficient way to do this?

import pandas
mainData = pandas.read_csv("mainData.csv")
barcodes = mainData["Barcode"]
authors = mainData["Author"]
titles = mainData["Title/Subtitle"]
callNumbers = mainData["Call Number"]
k = "Han, Jenny,"
for i in authors:
    if k == i:
        print("Success")
        k = authors.index[k]
        print(authors[k])
else:
    print("Fail" + k)
#    Please Note: This code only checks for an author match and has all other fields left out as I thought this code was too inefficient to add the rest of the fields. The code also does not find the line on witch the matched are located, therefore .loc[] can not be used to print out all the data found.

This is the code I am using right now, It outputs the result along with an error Python IndexError: only integers, slices (\`:\`), ellipsis (\`\...\`), numpy.newaxis (\`None\`) and integer or boolean arrays are valid indices and is very slow. I would like the code to be able to output the books and their respective info. I have found the the .loc[] feature (mentioned above) outputs the info quite nicely. Here is the data I am using .

Edit: I have been able to reduce the time it takes for the program to run and made a functional "prototype"

authorFirst = authorFirst.lower()
authorFirst = authorFirst.title()
authorFirst += ","
authorSecond = input("Enter author's last name: ")
authorSecond = authorSecond.lower()
authorSecond = authorSecond.title()
authorSecond += ", "

authorInput = authorSecond + authorFirst

print(mainData[mainData["Author"].isin([authorInput])])

bookChoice = input("Please Enter the number to the left of the barcode to select a book: ")
print(mainData.loc[int(bookChoice)])

id provides the functionality that I am looking for but I feel that there has to be a better way of doing it. (Not asking the user to input the row number). Idk if this is possible tho.

I am new to python and this is my first time using pandas so i'm sorry if this is really shitty and hurts your brain.

Thank-you so much for your time!



Solution 1:[1]

Pandas does not really need to find the numeric index of something, to do indexing.

Since you have not provided any starting point or data, I'll just provide a few pointers here as there are mans ways to match and index things in pandas.

import pandas as pd

# build a library
library = pd.DataFrame({
    "Author": ["H.G. Wells", "Hubert Selby Jr.", "Ken Kesey"],
    "Title": [
        "The War of the Worlds",
        "Requiem for a Dream",
        "One Flew Over the Cuckoo's Nest",
        ],
    "Published": [1898, 1979, 1962],
})

# find on some characteristics
mask_wells = library.Author.str.contains("Wells")
mask_rfad = library["Title"] == "Requiem for a Dream"
mask_xixth = library["Published"] < 1900

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ljmc