Как использовать словарь в качестве рубрики для присвоения значения фрейму данных с помощью pd.apply () - PullRequest
0 голосов
/ 12 февраля 2019
def create_rubric(number, df, col):
"""
First finds all the unique fields then segments them in quintiles.
Uses the quintiles to give ratings to the original data
"""

    sorted_col = df[col].sort_values()
    unique_val = sorted_col.unique()
    unique_cut = pd.qcut(unique_val,number,labels=False)
    unique_dict = {"Items" : unique_val, "Labels" : unique_cut}
    df = pd.DataFrame(unique_dict)
    rubric = {}
    rubric[1] = df[df.Labels == 0]
    rubric[2] = df[df.Labels == 1]
    rubric[3] = df[df.Labels == 2]
    rubric[4] = df[df.Labels == 3]
    rubric[5] = df[df.Labels == 4]
    return rubric

def frequency_star_rating(x, rubric):
"""
Uses rubric to score the rows in the dataframe
"""
    for rate, key in rubric.items():
        if x in key:
            return rate

rubric = create_rubric(5,rfm_report,"ordersCount")
rfm_report["Frequency Rating"] = rfm_report["ordersCount"].apply(frequency_star_rating, rubric)

Я написал две функции, которые должны взаимодействовать друг с другом.Один создает рубрику оценки, которая заканчивается в словаре, а другой должен использовать этот словарь для оценки строк в кадре данных, насчитывающем около 700 000 строк.По какой-то причине я продолжаю получать сообщение об ошибке «Объекты Series являются изменяемыми и не могут быть хэшированы».Я действительно не могу найти лучший способ сделать это.Я неправильно написал функции?

1 Ответ

0 голосов
/ 12 февраля 2019

Было бы неплохо, если бы вы могли предоставить набор игрушечных данных, чтобы мы могли быстро запустить ваш код и посмотреть, где происходит ошибка.

При попытке получить сообщение о том, что объект pd.Series выдает ошибкуне может быть использован в качестве ключа словаря.Причина в том, что словари Python являются хеш-таблицами.Таким образом, они принимают только хешируемые типы данных в качестве ключа.Например, строки и целые числа являются хэшируемыми, а списки - нет.Таким образом, следующее работает нормально:

fine_dict = {'John': 1, 'Lilly': 2}

В то время как этот вызовет TypeError:

wrong_dict = {['John']: 1, ['Lilly']: 2}

Ошибка будет выглядеть следующим образом: TypeError: unhashable type: 'list'.

Итак, я догадываюсь, что где-то в вашем коде вы пытаетесь использовать объект Series в качестве ключа словаря, чего не следует делать, потому что он не хэш.

...