Понимание списка столбцов панд Результатов в: unhashable тип: 'dict' - PullRequest
0 голосов
/ 05 октября 2018

Я загрузил Kaggle Kernel в виде файла Jupyter Notebook, который я пытаюсь запустить в своей локальной системе.Ядро отлично работает на Kaggle.Однако следующая строка (в ячейке 4) выдает ошибку, когда я пытаюсь запустить его как файл .ipynb:

cols_to_drop = [col for col in train_df.columns if train_df[col].nunique(dropna=False) == 1]

Возвращается ошибка:

TypeError: unhashable type: 'dict'

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

Я пробовал несколько альтернативных версий кода, основанных на формате, приведенном в этой статье о понимании списка..

new_list = [expression(i) for i in old_list if filter(i)]

Однако они выдают ту же ошибку.

1 Ответ

0 голосов
/ 05 октября 2018

pd.Series.nunique вызовы pd.Series.unique под капотом:

def nunique(self, dropna=True):
    uniqs = self.unique()
    n = len(uniqs)
    if dropna and isna(uniqs).any():
        n -= 1
    return n

pd.Series.unique использует хеширование, во многом как встроенный в Python setпод капотом:

Уникальная хеш-таблица, поэтому НЕ сортируется.

По крайней мере одно из значений в одном из рядов в train_df содержиттолковый словарь.Словари не являются хэшируемыми.Таким образом, вы увидите TypeError: unhashable type: 'dict'.

Чтобы увидеть, какие серии включают в себя какие типы, вы можете использовать словарное понимание:

type_dict = {col: set(map(type, train_df[col].values)) for col in train_df}

Вот тривиальный пример:

df = pd.DataFrame({'A': [1, 'a', 'b', 4, {'some_dict': 3}], 'B': list(range(5))})
type_dict = {col: set(map(type, df[col].values)) for col in df}

print(type_dict)

{'A': {dict, int, str}, 'B': {numpy.int64}}

Чтобы использовать nunique для подсчета уникальных элементов, вам необходимо очистить ваши данные, чтобы убедиться, что ваш фрейм данных не содержит нехешируемых значений.

...