将Pandas多级索引系列转换为Json Python

3

你好,我有两个类似于下面的pandas序列:

PnL

           Product Name      Price
Company A  Orange            3000
Company B  Apple             2000
           Grapes            1000

税收

           Product Name      Price
Company A  Orange            100
Company B  Apple             100
           Grapes            10

我希望将pandas系列转换成以下JSON格式。
{'PnL':{'Company A':{'productName':'Orange','price':3000},
        'Company B':[{'productName':'Apple','price':2000},
                     {'productName':'Grapes','price':1000}]
       },
 'Tax':{'Company A':{'productName':'Orange','price':100},
        'Company B':[{'productName':'Apple','price':100},
                     {'productName':'Grapes','price':10}]
       }
}

我尝试使用以下代码

convertedJson = json.dumps([{'company': k[0], 'productName':k[1],'price': v} for k,v in df.items()])

但是我无法生成我想要生产的JSON。

谢谢你的帮助。


1
使用 to_json 函数 - https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_json.html - Nordle
谢谢您的建议,但我已经尝试使用to_json(orient="index"),但它无法产生我想要的结果。 - Platalea Minor
1个回答

13
你可以使用 concat 来连接 DataFrame,然后再使用 groupbyto_dict 以获得期望的输出结果:
df = pd.concat([s1, s2], keys=('PnL','Tax')).reset_index()
df.columns = ['type','company','productName','price']
print (df)
  type    company productName  price
0  PnL  Company A      Orange   3000
1  PnL  Company B       Apple   2000
2  PnL  Company B      Grapes   1000
3  Tax  Company A      Orange   3000
4  Tax  Company B       Apple   2000
5  Tax  Company B      Grapes   1000

d = (df.groupby(['type','company'])['productName','price']
       .apply(lambda x: x.to_dict('r'))
       .reset_index(name='data')
       .groupby('type')['company','data']
       .apply(lambda x: x.set_index('company')['data'].to_dict())
       .to_json()
       )

print (d)

{
    "PnL": {
        "Company A": [{
            "productName": "Orange",
            "price": 3000
        }],
        "Company B": [{
            "productName": "Apple",
            "price": 2000
        }, {
            "productName": "Grapes",
            "price": 1000
        }]
    },
    "Tax": {
        "Company A": [{
            "productName": "Orange",
            "price": 3000
        }],
        "Company B": [{
            "productName": "Apple",
            "price": 2000
        }, {
            "productName": "Grapes",
            "price": 1000
        }]
    }
}

你能解释一下这行代码reset_index(name='data')吗?@jezrael - Astrian_72954

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接