Панды в JSON не могут получить его в нужном формате

Это действительно расстраивает меня, и я чувствую, что перепробовал все. У меня есть базовый фрейм данных Pandas, который выглядит так:

order   name        lat     long    open    close
123     Walgreens   37.5    50.4    08:00:00    17:00:00
456     CVS         16.7    52.4    09:00:00    12:00:00
789     McDonald's  90.7    59.1    12:00:00    14:00:00 

Мне нужно преобразовать этот фрейм данных в объект JSON, который выглядит следующим образом:

    {
      "123": {
    "Location": {
      "Name": "Walgreens",
      "Lat": 37.5,
      "Long": 50.4
    },
    "Open": 08:00:00,
    "Close": 17:00:00
  },
  "456": {
    "Location": {
      "Name": "CVS",
      "Lat": 16.7,
      "Long": 52.4
    },
    "Open": 09:00:00,
    "Close": 12:00:00
  },
  "789": {
    "Location": {
      "Name": "McDonald's", 
      "Lat": 90.7, 
      "Long":   59.1
     }, 
     "Open": 12:00:00, 
    "Close" : 14:00:00 } } }

Я попробовал немало методов, пытаясь заставить его выглядеть так, но либо я застрял с дополнительными косыми чертами, либо я не смогу сделать правильные цитаты, независимо от того, что я делаю. Я создал метод Pandas to_json и превратил его в словарь, а затем выполнил json.loads или json.dumps, и он просто не будет работать правильно.

Один метод, который я попробовал, делает это:

json_dict = {}

    for i in df.index:
        order_no = df.loc[i, 'order_no']
        stop_name = df.loc[i, 'Name']
        lat = df.loc[i, 'latitude']
        lng = df.loc[i, 'longitude']   
        start = df.loc[i, 'start']
        end = df.loc[i, 'end']
        json_dict[str(order_no)] = '{{"location" : {{  "name":  "{0}", 
        "lat" : "{1}", "long" : "{2}" }}, "open" : "{3}", "close" : "{4}"  
         }}'.format(name, lat, long, start, end)

      json.dumps(json_dict) 

и это заканчивает тем, что добавило целую кучу обратных косых черт в это. Как правильно настроить форматирование? Спасибо за вашу помощь!

Всего 2 ответа


с источником данных, df который выглядит так:

order   name        lat     long    open        close
123     Walgreens   37.5    50.4    08:00:00    17:00:00
456     CVS         16.7    52.4    09:00:00    12:00:00
789     McDonald's  90.7    59.1    12:00:00    14:00:00 

чтобы получить желаемый вывод json, нам нужно сделать следующее:

  • Преобразовать имена столбцов в заглавные буквы
  • Создайте столбец Location словаря типов, объединяющего name , lat , long
  • Преобразовать в JSON, где order является ключом верхнего уровня

Код:

# import json & pprint to pretty print the output
import json
import pprint

import pandas as pd

df.columns = [x.capitalize() for x in df.columns]
location_keys = ['Name', 'Lat', 'Long']
df['Location'] = df[location_keys].to_dict(orient='records')  
json_str = df.set_index('Order').drop(location_keys, axis=1).to_json(orient='index')

# print output with nice json formatting
pprint.pprint(json.loads(json_str))
# outputs:
{飓': {'Close': ཌྷ:00:00',
         'Location': {'Lat': ཡ.5', 'Long': ཮.4', 'Name': 'Walgreens'},
         'Open': ང:00:00'},
 騠': {'Close': ཈:00:00',
         'Location': {'Lat': ཌ.7', 'Long': ཰.4', 'Name': 'CVS'},
         'Open': ཅ:00:00'},
 魭': {'Close': ཊ:00:00',
         'Location': {'Lat': ྖ.7', 'Long': ཷ.1', 'Name': "McDonald's"},
         'Open': ཈:00:00'}}

Если вы установите индекс в order , вы можете ориентироваться на index :

 import pandas as pd records [{'order': '123', 'name': 'Walgreens', 'lat': '37.5', 'long': '50.4', 'open': '08:00:00', 'close': '17:00:00'}, {'order': '456', 'name': 'CVS', 'lat': '16.7', 'long': '52.4', 'open': '09:00:00', 'close': '12:00:00'}, {'order': '789', 'name': "McDonald's", 'lat': '90.7', 'long': '59.1', 'open': '12:00:00', 'close': '14:00:00'}] df = pd.DataFrame(records) df = df.set_index('order') 

Теперь df выглядит


close   lat  long        name      open
order
123    17:00:00  37.5  50.4   Walgreens  08:00:00
456    12:00:00  16.7  52.4         CVS  09:00:00
789    14:00:00  90.7  59.1  McDonald's  12:00:00

Чтобы получить это к dict питона

 df.to_dict(orient='index') { "123": { "close": "17:00:00", "lat": "37.5", "long": "50.4", "name": "Walgreens", "open": "08:00:00" }, "456": { "close": "12:00:00", "lat": "16.7", "long": "52.4", "name": "CVS", "open": "09:00:00" }, "789": { "close": "14:00:00", "lat": "90.7", "long": "59.1", "name": "McDonald's", "open": "12:00:00" } } 

Так как полное утверждение

 # if you prefer a one-liner # as python dict json_dict = df.set_index('order').to_dict(orient='index') # or as json string json_string = df.set_index('order').to_json(orient='index') 

Есть идеи?

10000