Обновление: я использую пример кода из «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:
если вы просто пытаетесь выяснить, какие столбцы генерируют ошибку, вы можете сделать for column in df
, тогда используйте df[column].describe()
, поскольку столбцы являются просто сериями, и вы можете вызвать описать серию
@Yuca - Слишком много столбцов для вывода заголовка. Что вы ищете?
@Thunderwood - Извините, я делаю это в Jupyter Notebook. Когда я приму ваше предложение, выхода нет. Помощь?
результат вашего конструктора фрейма данных. describe
является встроенным, поэтому единственная причина его отказа - наличие искаженного DataFrame.
@Yuca - Если вы можете рассказать мне о том, как получить вывод головы в кратком формате, я с радостью это сделаю!
мы можем разрезать первые 5 столбцов. так df.iloc [: 10,: 5]
@Yuca - см. Выше.
Содержат ли какие-либо из ваших столбцов значения dict
или dict-подобные значения?
Хорошо, поэтому я предполагаю, что, поскольку вы строите из JSON, один из ваших столбцов содержит объект типа 'dict'. Не знаю, как помочь вам его найти. Но я готов поспорить, что это проблема
@Thunderwood - Хорошо, я принял ваше предложение (у меня была ошибка в предложенной вами реализации), и я все еще получаю ту же ошибку.
@ G Anderson, @Yuca - Да, кажется (по крайней мере) один столбец является «объектом типа dict» (хотя я думал, что объекты принадлежат к собственному типу!). Но вопрос в том, как его найти. Всего около 40 столбцов, и метод грубой силы не является ни привлекательным, ни поучительным.
Вы можете начать с df.select_dtypes(object).columns
, чтобы найти все столбцы с нечисловыми типами данных
что возвращает df.dtypes
?
@G Anderson, @ MrE - Все объекты.
Это громоздко, но я не могу понять, как лучше всего превратить его в маску. Это даст вам каждый столбец и где это dict
: [df[i].transform(type) == dict for i in df.columns]
(из этот ответ)
@G Anderson Кажется, это возвращает логическое значение для КАЖДОГО элемента в df. Однако после прокрутки всех выходных данных я обнаружил один столбец, который, по-видимому, является нарушителем. Как бы вы уменьшили вывод до истинного или ложного значения для каждого столбца? Списочное ИЛИ?
@G Anderson - Думаю, я понял, как этого добиться, благодаря комментарию G Anderson выше. См. Мой отредактированный вопрос выше. Спасибо всем!
Благодаря сообществу пользователей (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 кажется решением
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.
Проблема связана с отслеживаются и, по-видимому, исправлена в мастере, который, я полагаю, перейдет в следующую версию.
вы можете включить результаты с
df.head()
?