Pandas DataFrame для частично вложенного JSON - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть вопрос, похожий на этот . Однако мне нужно, чтобы мой JSON был частично вложенным. В настоящее время мой фрейм данных выглядит так:

df = pd.DataFrame({'subsidary': ['company name','company name'],
                   'purchase_order_number': ['PO Num', 'PO Num'],
                   'invoice_date': ['2018-10-15', '2018-10-15'],
                   'vendor_invoice_number': ['777','777'],
                   'vendor_sku': ['SKU888', 'SKU888'],
                   'quantity': ['10', '20'],
                   'rate': ['12.00', '11.00'],
                   'amount': ['120.00', '220.00'],
                   'freight': ['5.00', '5.00'],
                   'taxes': ['0.00', '0.00']})

Используя ссылку выше и код ниже:

j = (df.groupby(['subsidary','purchase_order_number','invoice_date','vendor_invoice_number'], as_index=False)
           .apply(lambda x: x[['vendor_sku','quantity','rate','amount']].to_dict('r'))
           .reset_index()
           .rename(columns={0:'item_charges'})   
           .to_json(orient='records'))

print(json.dumps(json.loads(j), indent=2, sort_keys=False))

Я смог заставить его выглядеть так:

[
  {
    "subsidary": "company name",
    "purchase_order_number": "PO Num",
    "invoice_date": "2018-10-15",
    "vendor_invoice_number": "777",
    "item_charges": [
      {
        "vendor_sku": "SKU888",
        "quantity": "10",
        "rate": "12.00",
        "amount": "120.00"
      },
      {
        "vendor_sku": "SKU888",
        "quantity": "20",
        "rate": "11.00",
        "amount": "220.00"
      }
    ]
  }
]

Однако мне бы хотелось, чтобы это выглядело так:

[
  {
    "subsidary": "Natural Partners",
    "purchase_order_number": "AZ003387-PO",
    "invoice_date": "2018-10-15",
    "vendor_invoice_number": "76947",
    "item_charges": [
      {
        "vendor_sku": "SUP002",
        "quantity": "12.00",
        "rate": "14.50",
        "amount": "174.00"
      },
      {
        "vendor_sku": "SUP004",
        "quantity": "3.00",
        "rate": "8.75",
        "amount": "26.25"
      }
    ],
    "invoice_charges": 
    {
       "freight": '5.00',
       "taxes": '0.00',
    }
  }
]

Есть ли способ для меня сделать это в Python?

Заранее спасибо.

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете сделать это, сохранив каждое вложение перед обработкой следующего.

df = pd.DataFrame({'subsidary': ['company name','company name'],
                   'purchase_order_number': ['PO Num', 'PO Num'],
                   'invoice_date': ['2018-10-15', '2018-10-15'],
                   'vendor_invoice_number': ['777','777'],
                   'vendor_sku': ['SKU888', 'SKU888'],
                   'quantity': ['10', '20'],
                   'rate': ['12.00', '11.00'],
                   'amount': ['120.00', '220.00'],
                   'freight': ['5.00', '5.00'],
                   'taxes': ['0.00', '0.00']})

# Your original procedure
j = df.groupby(
    ['subsidary','purchase_order_number','invoice_date',
    'vendor_invoice_number', "freight", "taxes"],
     as_index=False).apply(lambda x: x[['vendor_sku','quantity','rate','amount']].to_dict('r')
                     ).reset_index().rename(columns={0:'item_charges'})

# Store the item_charges and do it again      
item_charges = j["item_charges"]
j=j.groupby(['subsidary','purchase_order_number','invoice_date',
             'vendor_invoice_number',"freight", "taxes"], as_index=False
              ).apply(lambda x: x[["freight", "taxes"]].to_dict('r')
              ).reset_index().rename(columns={0:'invoice_charges'})

# Add back the stored item_charges
j["item_charges"] = item_charges
j = j.to_json(orient='records')
print(json.dumps(json.loads(j), indent=2, sort_keys=False))

Я должен сказать, что я не в восторге от этого подхода, и я не могу представить, что он эффективен, но я подумал, что это работает. И это работает - вывод ниже:

[
  {
    "subsidary": "company name",
    "purchase_order_number": "PO Num",
    "invoice_date": "2018-10-15",
    "vendor_invoice_number": "777",
    "freight": "5.00",
    "taxes": "0.00",
    "invoice_charges": [
      {
        "freight": "5.00",
        "taxes": "0.00"
      }
    ],
    "item_charges": [
      {
        "vendor_sku": "SKU888",
        "quantity": "10",
        "rate": "12.00",
        "amount": "120.00"
      },
      {
        "vendor_sku": "SKU888",
        "quantity": "20",
        "rate": "11.00",
        "amount": "220.00"
      }
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...