Объединить фрейм данных в формате JSON с дополнительными данными

#python #json #pandas

#python #json #pandas

Вопрос:

Я хочу объединить некоторую метаинформацию вместе с фреймом данных Pandas в виде строки JSON.

Я могу вызвать df.to_json(orient='values') , чтобы получить данные фрейма данных в виде массива, но как мне объединить их с некоторыми дополнительными данными?

 result = {
  meta: {'some': 'meta info'},
  data: [[dataframe.values], [list], [...]]
}
  

Я мог бы также спросить: как мне объединить объект Python ( meta: {...} ) в сериализованную строку JSON ( df.to_json() )?

Ответ №1:

Вы всегда можете преобразовать JSON в данные Python.

 import json

df_json = df.to_json(orient='values') # JSON

py_data = json.loads( df_json ) # Python data

result['extra_data'] = py_data # merge data

json_all = json.dumps( result ) # JSON again
  

Редактировать:

Я нашел лучшее решение — использовать pandas.json.dumps
В стандартном модуле json возникла проблема с числами numpy, используемыми в словаре, созданном pandas.

 import pandas as pd

result = { 'meta': {'some': 'meta info'} }

df = pd.DataFrame([[1,2,3], [.1,.2,.3]], columns=('a','b','c'))

#result['extra_data'] = df.to_dict() # as dictonary

result['extra_data'] = df 

print pd.json.dumps( result )
  

Результат

 {
  "extra_data":{
      "a":{"0":1.0,"1":0.1},
      "c":{"0":3.0,"1":0.3},
      "b":{"0":2.0,"1":0.2}
  },
  "meta":{"some":"meta info"}
}
  

или

 import pandas as pd

result = { 'meta': {'some': 'meta info'} }

df = pd.DataFrame([[1,2,3], [.1,.2,.3]], columns=('a','b','c'))

df_dict = df.to_dict()

df_dict['extra_data'] = result

print pd.json.dumps( df_dict )
  

Результат

 {
   "a":{"0":1.0,"1":0.1},
   "c":{"0":3.0,"1":0.3},
   "b":{"0":2.0,"1":0.2}
   "extra_data":{"meta":{"some":"meta info"}},
}
  

Комментарии:

1. Верно, но это противоречит цели использования быстрого to_json метода pandas. Я не тестировал это, но я предполагаю, что будет быстрее прикрепить df.values к result , а затем jsonify, чем проходить через проблемы сериализации / несериализации и сериализации снова.

2. Смотрите новое решение в ответе.