TypeError при отображении столбцов DataFrame с использованием Python dict - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь преобразовать столбец фрейма данных Pandas в значения int, используя такое сопоставление (при условии, что данный фрейм данных: my_dataframe и столбец: target_column):

targets = my_dataframe[target_column].unique()
map_to_int = {name: n  for n, name in enumerate(targets)}

Использование Python 3.6 с пандами Интересно, почему

A)

my_dataframe['Integer-Column'] = map_to_int[my_dataframe[target_column]]

вызывает

TypeError: объекты 'Series' являются изменяемыми, поэтому их нельзя хэшировать

в то время как

В)

my_dataframe['Integer-Column'] = my_dataframe[target_column].replace(map_to_int)

отлично работает.

Я хотел бы понять, почему это происходит. Есть ли какая-то магия в замене, что TypeError не выдается или я что-то упустил? Я уже получил тот факт, что ключи не могут быть изменены. Но все же мне трудно понять это по-настоящему, так как:

    words = my_dataframe[target_column].unique()
    # words = ['car' 'bike' 'plain']

    foo = 'car'
    map_to_int[foo] = 0
    foo = 'bike'
    map_to_int["bike"] = 1

Буду признателен за любую попытку помочь мне понять, почему B) работает без проблем с A).

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Ваше решение не работает, потому что с map_to_int[my_dataframe[target_column]] вы пытаетесь использовать объект pd.Series в качестве словарного ключа.

Кроме того, я рекомендую использовать replace только в определенных обстоятельствах; для отображения в словаре обычно следует использовать pd.Series.map, т.е. my_dataframe[target_column].map(map_to_int). См. Замените значения в серии панд эффективно через словарь для получения более подробной информации.

Но эта функция уже реализована в Pandas как Категориальные данные . Я рекомендую использовать категориальные данные как эффективный и синтаксически чистый способ отображения элементов в серии в целые числа.

Вот пример:

df = pd.DataFrame({'col1': ['a', 'b', 'c', 'a', 'b', 'a', 'd']})

df['col1'] = df['col1'].astype('category').cat.codes

print(df)

   col1
0     0
1     1
2     2
3     0
4     1
5     0
6     3
0 голосов
/ 05 июля 2018

Очевидно, my_dataframe[target_column] - это то, что python (3.6) считает изменчивым. Использование изменяемого материала в качестве ключа в dict приводит к упомянутой ошибке TypeError. Следовательно, при вызове словаря типа map_to_int он выдает ошибку.

В версии B) словарь map_to_int все еще используется, но ключи в словаре явно не упоминаются. Более того, они являются неизменными представлениями всего, что содержится в targets. Поэтому, когда функция замены (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.replace.html) использует словарь, она использует эти неизменяемые ключи. Поэтому нет причины для сброса TypeError, то есть того, что было обнаружено.

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