Python - Pandas Describe Throwing Error: нехешируемый тип 'dict'

Обновление: я использую пример кода из «Socrata Open Source API». Отмечу следующий комментарий в коде:

# First 2000 results, returned as JSON from API / converted to Python 
# list of dictionaries by sodapy.

Я не очень хорошо знаком с JSON.

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

df = pd.DataFrame.from_records(results)

Когда я пытаюсь использовать метод describe (), я получаю «TypeError: unhashable type: 'dict'»:

df.describe()
...
TypeError: unhashable type: 'dict'

Как определить столбцы, в которых возникает эта ошибка?

ОБНОВЛЕНИЕ 2: По просьбе Юки я прилагаю выдержку из df:

Python - Pandas Describe Throwing Error: нехешируемый тип 'dict'

вы можете включить результаты с df.head()?

Yuca 25.10.2018 22:31

если вы просто пытаетесь выяснить, какие столбцы генерируют ошибку, вы можете сделать for column in df, тогда используйте df[column].describe(), поскольку столбцы являются просто сериями, и вы можете вызвать описать серию

Thunderwood 25.10.2018 22:35

@Yuca - Слишком много столбцов для вывода заголовка. Что вы ищете?

GPB 25.10.2018 22:41

@Thunderwood - Извините, я делаю это в Jupyter Notebook. Когда я приму ваше предложение, выхода нет. Помощь?

GPB 25.10.2018 22:43

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

Yuca 25.10.2018 22:43

@Yuca - Если вы можете рассказать мне о том, как получить вывод головы в кратком формате, я с радостью это сделаю!

GPB 25.10.2018 22:45

мы можем разрезать первые 5 столбцов. так df.iloc [: 10,: 5]

Yuca 25.10.2018 22:51

@Yuca - см. Выше.

GPB 25.10.2018 23:03

Содержат ли какие-либо из ваших столбцов значения dict или dict-подобные значения?

G. Anderson 25.10.2018 23:06

Хорошо, поэтому я предполагаю, что, поскольку вы строите из JSON, один из ваших столбцов содержит объект типа 'dict'. Не знаю, как помочь вам его найти. Но я готов поспорить, что это проблема

Yuca 25.10.2018 23:06

@Thunderwood - Хорошо, я принял ваше предложение (у меня была ошибка в предложенной вами реализации), и я все еще получаю ту же ошибку.

GPB 25.10.2018 23:07

@ G Anderson, @Yuca - Да, кажется (по крайней мере) один столбец является «объектом типа dict» (хотя я думал, что объекты принадлежат к собственному типу!). Но вопрос в том, как его найти. Всего около 40 столбцов, и метод грубой силы не является ни привлекательным, ни поучительным.

GPB 25.10.2018 23:09

Вы можете начать с df.select_dtypes(object).columns, чтобы найти все столбцы с нечисловыми типами данных

G. Anderson 25.10.2018 23:17

что возвращает df.dtypes?

MrE 25.10.2018 23:18

@G Anderson, @ MrE - Все объекты.

GPB 25.10.2018 23:21

Это громоздко, но я не могу понять, как лучше всего превратить его в маску. Это даст вам каждый столбец и где это dict: [df[i].transform(type) == dict for i in df.columns] (из этот ответ)

G. Anderson 25.10.2018 23:28

@G Anderson Кажется, это возвращает логическое значение для КАЖДОГО элемента в df. Однако после прокрутки всех выходных данных я обнаружил один столбец, который, по-видимому, является нарушителем. Как бы вы уменьшили вывод до истинного или ложного значения для каждого столбца? Списочное ИЛИ?

GPB 25.10.2018 23:33

@G Anderson - Думаю, я понял, как этого добиться, благодаря комментарию G Anderson выше. См. Мой отредактированный вопрос выше. Спасибо всем!

GPB 26.10.2018 01:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
18
3 948
3

Ответы 3

Благодаря сообществу пользователей (h / t G Anderson) я собрал решение:

for i in df.columns:
if df[i].transform(type).any() == dict:
    df = df.drop(i, axis= 1)

transform (type) .any () проверяет все элементы в столбце i и удаляет столбец, если элемент имеет тип dict.

Спасибо всем!

Сегодня я столкнулся с той же проблемой и немного исследовал разные версии pyarrow. здесь Я обнаружил, что в прошлом (<0,13) pyarrow записывал реальные столбцы данных для индекса с именами. В самой последней версии pyarrow не было данных столбца, а вместо этого был маркер метаданных индекса диапазона. Это означает, что файлы паркета, созданные с помощью более новой версии pyarrow, не могут быть прочитаны более старыми версиями.

Установка правильной версии pyarrow кажется решением

Adrien Forbu 06.08.2019 17:36

pandas0.25.3 в порядке с чтением json, содержащего dicts, по-видимому, pandas1.0.1 не так много

df = pd.read_json(path,lines=True)
TypeError: unhashable type: ‘dict’ 

Выше выбрасывается pandas1.0.1 для того же файла, для которого он работает в pandas0.25.3.

Проблема связана с отслеживаются и, по-видимому, исправлена ​​в мастере, который, я полагаю, перейдет в следующую версию.

Другие вопросы по теме