我正在尝试使用pandas构建一个DataFrame,但当我拥有可变大小的JSON块时,我无法处理这种情况。
如:第一块:
{'ad': 0,
'country': 'US',
'ver': '1.0',
'adIdType': 2,
'adValue': '5',
'data': {'eventId': 99,
'clickId': '',
'eventType': 'PURCHASEMADE',
'tms': '2019-12-25T09:57:04+0000',
'productDetails': {'currency': 'DLR',
'productList': [
{'segment': 'Girls',
'vertical': 'Fashion Jewellery',
'brickname': 'Traditional Jewellery',
'price': 8,
'quantity': 10}]},
'transactionId': '1254'},
'appName': 'xer.tt',
'appId': 'XR',
'sdkVer': '1.0.0',
'language': 'en',
'tms': '2022-04-25T09:57:04+0000',
'tid': '124'}
块2:
{'ad': 0,
'country': 'US',
'ver': '1.0',
'adIdType': 2,
'adValue': '78',
'data': {'eventId': 7,
'clickId': '',
'eventType': 'PURCHASEMADE',
'tms': '20219-02-25T09:57:04+0000',
'productDetails': {'currency': 'DLR',
'productList': [{'segment': 'Boys',
'vertical': 'Fashion',
'brickname': 'Casuals',
'price': 10,
'quantity': 5},
{'segment': 'Girls',
'vertical': 'Fashion Jewellery',
'brickname': 'Traditional Jewellery',
'price': 8,
'quantity': 10}]},
'transactionId': '3258'},
'appName': 'xer.tt',
'appId': 'XR',
'sdkVer': '1.0.0',
'language': 'en',
'tms': '2029-02-25T09:57:04+0000',
'tid': '124'}
现在在ProductDetails中,产品的数量正在发生变化,在第一个数据块中,我们只有一个产品列表,它是详细的,但在第二个数据块中,我们有两个产品列表,它是详细的,对于进一步的数据块,我们也可以为其他数据块提供任意数量的产品。(即块~记录)
我试着写一些python脚本,但没有找到任何好的解决方案。
如果需要进一步的细节,请在评论中告诉我。谢谢!
你能做的,就是使用pd.json_normalize
,并拥有最多的" inner ";字典作为record_path
,所有其他你感兴趣的数据作为meta
。下面是一个如何构建它的深入示例:pandas.io.json。Json_normalize with very nested json
在你的例子中,这将是(对于单个对象):
df = pd.json_normalize(obj,
record_path=["data", "productDetails", "productList"],
meta=([
["data", "productDetails", "currency"],
["data", "transactionId"],
["data", "clickId"],
["data", "eventType"],
["data", "tms"],
"ad",
"country"
])
)