Получение объектов «Series» является изменяемым, поэтому их нельзя хэшировать »при использовании фрейма данных в функции apply - PullRequest
0 голосов
/ 26 сентября 2019

Я за свою жизнь не могу понять, как избавиться от этой ошибки!Я пытаюсь увидеть, имеют ли два разных фрейма данных два столбца с одной и той же строкой (например, если у обоих фреймов данных есть столбцы «Джексонвилл» в столбцах «Город» и «Флорида» в столбце «Штат»).Я пытаюсь запустить:

hpricesold = convert_housing_data_to_quarters()
hprices = hpricesold.copy()
hprices = hprices.reset_index(inplace=False)

def is_uni(df):
    if df in get_list_of_university_towns():
        return 1
    else:
        return 0

hprices['Is_Uni'] = hprices.apply(is_uni, axis=1)

и две вызываемые определения:

def convert_housing_data_to_quarters():
    #create
    hd = pd.read_csv('City_Zhvi_AllHomes.csv')
    hd['State'] = hd['State'].map(states)
    hd = hd.set_index(["State", "RegionName"])
    hd = hd.drop(hd.loc[:, '1996-04':'1999-12'], inplace = False, axis = 1)


    hd = hd.loc[:, '2000-01':'2016-08']
    #finds the average value for each quarter
    hd = hd.groupby(np.arange(len(hd.columns))//3, axis=1).mean()

    #now to name the stupid thing...
    rec = pd.read_excel('gdplev.xls', header = [4])
    rec = rec.drop([0,1], axis=0)
    start = rec[rec["Unnamed: 4"] =="2000q1"].index.values.astype(int)[0]

    rec = rec.loc[start:]

    rec = rec.reset_index()
    rec = rec.drop(['index', 'Unnamed: 0', 'GDP in billions of current dollars',
           'GDP in billions of chained 2009 dollars', 'Unnamed: 3', 'Unnamed: 7'], axis = 1)
    rec = rec.rename(columns = {'Unnamed: 4' : 'Year', 
                                'GDP in billions of current dollars.1' : 'GDP (bil current)', 
                                'GDP in billions of chained 2009 dollars.1' : 'GDP (bil chained 2009)'})
    rec = rec.append({'Year' : '2016q3'}, ignore_index = True)


    for col in hd.columns:
        hd = hd.rename(columns = {hd.columns[col] : rec.loc[col, 'Year']})





def get_list_of_university_towns():
    #utowns = pd.read_table('university_towns.txt', header=None)
    #utowns = utowns.rename(columns = {0: 'Info'})

    lst = []
    state = ''
    regname = ''

    with open('university_towns.txt') as utowns:
        for line in utowns:
            if line.find("[edit]") != -1:
                location = line.find("[edit]")
                state = line[:location]
                #print (line[:location])

            elif line.find(" (") != -1:
                location = line.find(" (")
                regname = line[:location]
                #print (line[:location])
                lst.append([state, regname])
            #if line.find(":") != -1:
            #    location = line.find(":")
            #    regname = line[:location+1]
            #    lst.append([state, regname])
            else:
                regname = line[:-1]
                #print (regname)
                lst.append([state, regname])

    utowns = pd.DataFrame(lst, columns = ['State', 'RegionName'])
    return utowns

У меня такое ощущение, что источником моей ошибки является то, как я манипулирую своим кадром данных вconvert_housing_data_to_quarters (), но я немного заблудился в коде.Мне кажется, что имеет смысл, что каждый тип столбца является Серией, но как бы я тогда сделал его неизменным, чтобы я мог передать эту функцию?

1 Ответ

0 голосов
/ 26 сентября 2019

Примечание строка hprices['Is_Uni'] = hprices.apply(is_uni, axis=1) в вашем коде.Он применяет функцию is_uni к каждой строке из hprices (поскольку вы передали axis = 1 ).

А теперь посмотрите на начальную строку этой функции: def is_uni(df):.

Это означает, что df на самом деле вся строка .

Следующая строка содержит if df in get_list_of_university_towns():, поэтому вы пытаетесь проверитьвесь этот ряд, находится ли он в списке университетских городов (и именно это, вероятно, является источником ошибки).

Я вижу здесь 2 пункта для исправления:

  1. Вместо df (вся строка), поместите здесь только столбец, содержащий название города.
  2. После в вместо всех DataFrame, возвращаемых этой функцией, ставьте толькостолбец, содержащий города университетов.

Еще одно замечание: плохая практика - вызывать функцию, генерирующую весь цикл DataFrame в цикле, каждый раз возвращая один и тот же результат.

Скорее получите этоDataFrame один раз, перед этим циклом, сохраните его в переменной и передайте этой функции в качестве параметраr.

И последнее замечание: не используйте df имя переменной в тех местах, где ее содержимое фактически отличается от DataFrame .В этом случае это строка из DataFrame , так что вы можете изменить это имя на row , и код станет намного более читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...