Converting a Dataframe into a specific json format

Tags: , ,



I need to convert this dataframe into the json format below and I can’t get it to work

conv_item_id updated_item_value order_check
a 1.99 approved
b 2.99 approved
c 2.99 approved
{
   "conversion_items":{
      "a":{
        "item_value":1.99,
        "status":"approved"
    },
      "b":{
        "item_value":2.99,
        "status":"approved"
    },
      "c":{
        "item_value":2.99,
        "status":"approved"
    }
  }
}

I currently have this function that converts the dataframe into a string

# build all our requests
def build_request(row):   
    return {
        row["conv_item_id"]: {
                "item_value": row["updated_item_value"],
                "status" : str.lower(row["order_check"])
            }
        }

request_payload = df.apply(build_request, axis=1).to_json(orient='records')[1:-1].replace('}{', '} {')

df2 = {"conversion_items": request_payload}

gives the following result as a string

{'conversion_items': '{"a":{"item_value":1.99,"status":"approved"}},{"b":{"item_value":2.99,"status":"approved"}},{"c":{"item_value":2.99,"status":"approved"}}'}

I need the format to be

{'conversion_items': {"a":{"item_value":1.99,"status":"approved"},"b":{"item_value":2.99,"status":"approved"},"c":{"item_value":2.99,"status":"approved"}}

Does anyone have any idea how to do this? I’ve attempted to use strip and replace but it either only removes the final } or all of them.

Thanks in advance,

Answer

Example df:

import pandas as pd
df = pd.DataFrame({"conv_item_id":["a","b","c"],"updated_item_value":[1.99,2.99,2.99],"order_check":["approved"]*3})
  • set index to conv_item_id using df.set_index()
  • rename column names using df.rename()
  • Convert df to dict with index as keys using df.to_dict("index")
  • dump dict to json using json.dumps()
import json
df = df.set_index("conv_item_id")
df = df.rename(columns={"updated_item_value":"item_value","order_check":"status"})
out = json.dumps({"conversion_items": df.to_dict("index")})
print(out)

>> {'conversion_items': {'a': {'item_value': 1.99, 'status': 'approved'},
  'b': {'item_value': 2.99, 'status': 'approved'},
  'c': {'item_value': 2.99, 'status': 'approved'}}}


Source: stackoverflow