Преобразование типа numpy в python

У меня есть список dicts в следующей форме, которую я генерирую из pandas. Я хочу преобразовать его в формат json.

list_val = [{1.0: 685}, {2.0: 8}] output = json.dumps(list_val) 

Однако json.dumps выдает ошибку: TypeError: 685 не является сериализуемым JSON

Я предполагаю, что это проблема преобразования типов с numpy на python (?).

Однако, когда я преобразовываю значения v каждого dict в массив с помощью np.int32 (v), он все равно выдает ошибку.

EDIT: Вот полный код

  new = df[df[label] == label_new] ks_dict = json.loads(content) ks_list = ks_dict['variables'] freq_counts = [] for ks_var in ks_list: freq_var = dict() freq_var["name"] = ks_var["name"] ks_series = new[ks_var["name"]] temp_df = ks_series.value_counts().to_dict() freq_var["new"] = [{u: np.int32(v)} for (u, v) in temp_df.iteritems()] freq_counts.append(freq_var) out = json.dumps(freq_counts) 

3 Solutions collect form web for “Преобразование типа numpy в python”

Похоже, вы правы:

 >>> import numpy >>> import json >>> json.dumps(numpy.int32(685)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/json/__init__.py", line 243, in dumps return _default_encoder.encode(obj) File "/usr/lib/python2.7/json/encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/lib/python2.7/json/encoder.py", line 270, in iterencode return _iterencode(o, 0) File "/usr/lib/python2.7/json/encoder.py", line 184, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: 685 is not JSON serializable 

К сожалению, здесь __repr__ числа __repr__ не дают вам никакого намека на то, какой тип они есть. Они бегают вокруг маскировки как int s, когда они не ( задыхаются ). В конечном счете, похоже, что json говорит вам, что int не является сериализуемым, но на самом деле он говорит вам, что этот конкретный np.int32 (или любой другой тип, который у вас есть на самом деле) не является сериализуемым. (Никакого реального удивления нет – нет np.int32 сериализуется). Вот почему dict, который вы неизбежно напечатали, прежде чем передать его json.dumps выглядит так, как будто в нем есть целые числа.

Самое легкое обходное решение здесь, вероятно, для написания собственного сериализатора 1 :

 class MyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, numpy.integer): return int(obj) elif isinstance(obj, numpy.floating): return float(obj) elif isinstance(obj, numpy.ndarray): return obj.tolist() else: return super(MyEncoder, self).default(obj) 

Вы используете его следующим образом:

 json.dumps(numpy.float32(1.2), cls=MyEncoder) json.dumps(numpy.arange(12), cls=MyEncoder) json.dumps({'a': numpy.int32(42)}) 

и т.п.

1 Или вы можете просто написать функцию по умолчанию и передать это как defaut ключевого слова json.dumps в json.dumps . В этом случае вы заменили бы последнюю строку на raise TypeError , но … meh. Класс более расширяем 🙂

Вы также можете преобразовать массив в список python (используйте метод tolist ), а затем преобразовать список в json.

Если вы оставите данные в любом из объектов pandas , библиотека поставляет функцию to_json для Series, DataFrame и всех других кузенов большего размера.

См. Series.to_json ()

  • Получить сопоставление категориальных переменных в пандах
  • Фильтрация кадра данных pandas с несколькими столбцами Boolean
  • Pandas groupby: Как получить объединение строк
  • Ошибка: объект float не имеет атрибута notnull
  • Заполнение пустого фрейма данных python с использованием циклов
  • Как использовать функцию pandas apply для всех столбцов ряда строк данных
  • Обновление существующей строки в базе данных из pandas df
  • Ошибка при использовании Pandas pivot_table с полями = True
  • Заполните массив 1D numpy массивами с индексами
  • Создайте pandas DataFrame из генератора?
  • Аннотировать тепловую карту со значением из кадра данных Pandas
  • Python - лучший язык программирования в мире.