TypeError: 'DataFrame' object is not callable

Написала код для сбора информации с сайта, обернула его в функцию:

def Table1(u):
#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# table 1 CA ---------------------------------------------------------------------------------------------------------------------------------
# C - Chairman / M - Members
# A - actual / H - historical
    Date = driver.find_element_by_xpath(DateLinls.iloc[u,0])
    trsCA = driver.find_elements_by_xpath('//div/table/tbody/tr[1]/td/div/table/tbody/tr[2]/td/div/table/tbody/tr') # used for Person name PN and previous jobs PJ
    aCA = "//div/table/tbody/tr[1]/td/div/table/tbody/tr[2]/td/div/table/tbody/tr[" # used for Person name PN and previous jobs PJ

# Person name variable +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    bCAPN = "]/td[1]/div/a"
    PNCAl1 = []
    for i in range(1,len(trsCA)+1):
        result = aCA + str(i) + bCAPN
        PNCAr = driver.find_element_by_xpath(result)
        PNCAl1.append(PNCAr.text)
        PNCA = pd.DataFrame(PNCAl1)
        #print(PNCA)
# Title ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    
    
    CATr = driver.find_element_by_xpath('//div/table/tbody/tr[1]/td/div/table/tbody/tr[1]/td/h3')

# Year of birth +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    bCAY = ']/td[1]/div/div[1]'
    CAYl = []
    for i in range(1,len(trsCA)+1):
        result = aCA + str(i) + bCAY 
        CAYr = driver.find_element_by_xpath(result)
        CAYl.append(CAYr.text)
        CAY = pd.DataFrame(CAYl)
# Education +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    bCAE = ']/td[1]/div/div[2]'
    CAEl = []
    for i in range(1,len(trsCA)+1):
        result = aCA + str(i) + bCAE 
        CAEr = driver.find_element_by_xpath(result)
        CAEl.append(CAEr.text)
        CAE = pd.DataFrame(CAEl)

# Previous Jobs and MAIN CODE =================================================================================================================
    
    bPJ = ']/td[3]/div'
    PJCAl =[]
    for i in range(1,len(trsCA)+1):
        result = aCA + str(i) + bPJ
        PJCAl.append(result)
        PJCA = pd.DataFrame(PJCAl)
    PJCAl = []
    PNCAl = []
    DPl = []
    CAJl = [] # JOBS 
    for i in range(0,len(trsCA)):
        trsPJCA1 = driver.find_elements_by_xpath(PJCA.iloc[i,0]) # this is a number of div
        DPl.append(len(trsPJCA1))
        DP = pd.DataFrame(DPl)
        NumbersOfNamesCA = numpy.array(DP.iloc[:,0])
        a3 = str(PJCA.iloc[i,0]) #this is begining of link 
        for j in range(1,len(trsPJCA1)+1): # continue taking previous jobs WORKS
            bCAJ1 = ']'
            bCAJ2 = '['
            result = a3 + bCAJ2 + str(j) + bCAJ1
            CAJr = driver.find_element_by_xpath(result)
            print(CAJr.text)
            CAJl.append(CAJr.text)
            CAJF = pd.DataFrame(CAJl)
# code which print/take names depends on how many time they need to be printed WORKS

    PNCAl1 = [] # NAME
    for g in range(0,len(trsCA)):
        a = int(g)
        for k in range(0,NumbersOfNamesCA[a]):
            if NumbersOfNamesCA[a] == 0:
                PNCAl1.append("-")
                PNCAF = pd.DataFrame(PNCAl1)
            else:
                PNCAl1.append(PNCA.iloc[g,0])
                PNCAF = pd.DataFrame(PNCAl1)

    CAYl1 = [] # YER OF BIRTH
    for g in range(0,len(trsCA)):
        a = int(g)
        for k in range(0,NumbersOfNamesCA[a]):
            if NumbersOfNamesCA[a] == 0:
                CAYl1.append("-")
                CAYF = pd.DataFrame(CAYl1)
            else:
                CAYl1.append(CAY.iloc[g,0])
                CAYF = pd.DataFrame(CAYl1)

    CAEl1 = [] # EDUCATION
    for g in range(0,len(trsCA)):
        a = int(g)
        for k in range(0,NumbersOfNamesCA[a]):
            if NumbersOfNamesCA[a] == 0:
                CAEl1.append("-")
                CAEF = pd.DataFrame(CAEl1)
            else:
                CAEl1.append(CAE.iloc[g,0])
                CAEF = pd.DataFrame(CAEl1)

    CATl = [] # Title
    for i in range(0,len(CAJF)):
        CATl.append(CATr.text)
        CAT = pd.DataFrame(CATl)

    CADl = [] # Date
    for i in range(0,len(CAJF)):
        CADl.append(Date.text)
        CAD = pd.DataFrame(CADl)

    CAIDl = [] # ID
    for i in range(0,len(CAJF)):
        CAIDl.append(IDd.iloc[u,0]) # 3 ingecates position of INN from Dataframe which we've created before in mine loop should be replased by i/j/wharever
        CAIDf = pd.DataFrame(CAIDl)
# concat to 1st table Database

    #FirstTable = pd.DataFrame(columns=(['ID', 'Title', 'Date', 'Name', 'YearOfBirth', 'Education', 'Jobs']))
    FirstTable = pd.concat([CAIDf, CAT, CAD, PNCAF, CAYF, CAEF, CAJF], axis=1)
    return FirstTable

Таких функций несколько. Хочу поместить их в цикл for, чтобы пройтись по списку страниц сайта.

Пока для теста это выглядит так:

if __name__ == '__main__':   
    u = 1
    driver.get(MyLinks.iloc[u,0])
    Table1 = Table1(u)
    #Table2 = Table2(u)
    #Table3 = Table3(u)
    #Table4 = Table4(u)

Проблема в том, что когда выделяю просто строку, например Table1 = Table1(u) и нажимаю F9, все прекрасно работает. Но когда выделяю весь код, выдает ошибку TypeError: 'DataFrame' object is not callable .

Пробовала использовать return(FirstTable) вместо return FirstTable все равно не работает.

The error traceback

Выдает следующее:

Traceback (most recent call last):

  File "<ipython-input-10-844b48fac0c3>", line 5, in <module>
    Table2 = Table2(u)

Ответы (1 шт):

Автор решения: MaxU

Стиль, в котором вы используете функции позволяет вызывать их не более одного раза.

После вызова:

func_name = func_name(...)

Объект func_name указывает на то, что вернула функция. Если функция вернула объект типа pandas.DataFrame, то при повторном вызове функции func_name() вы уже пытаетесь использовать объект типа pandas.DataFrame как функцию, о чем вам сообщают в сообщении об ошибке.

Не перезаписывайте имена функций и у вас не будет подобных проблем!

→ Ссылка