Глубокая вложенная нормализация JSON в Python pandas

Я хочу преобразовать файл JSON с глубокой вложенностью в CSV. Файл JSON

{"abcd-performance:output": {"performance": [{"sample": {"objectId": "abcd-device: 100: 12","ifName": "Carrier1/ 1", "timeStamp": "2021-10-20T03:15:00.000Z "," тип ":" радио "," недопустимый ": ложь," атрибут ": [{" параметр ":" rslReadingMean "," значение ": -36.4}, {" параметр ":" qam-32rx_time "," value ": 0}]}}, {" sample ": {" objectId ":" abcd-device: 100: 12 "," ifName ":" Carrier1/ 1 "," timeStamp ":" 2021-10-20T03:30:00.000Z "," type ":" radio "," invalid": false," attribute": [{" параметр ":" rslReadingMean "," value ": -36,5 },{"параметр": "qam-32rx_time", "значение": 0}]}}, {"образец": {"objectId": "abcd-device: 100: 13","ifName": "Терминал", " timeStamp ":" 2021-10-20T03:30:00.000Z "," type ":" sensor "," invalid": false," attribute": [{" параметр ":" InputCurrent "," значение ": 1.14} , {"параметр": "Температура", "значение": 61.5}, {"параметр": "Входное напряжение", "значение": 54.777}]}}]}}"тип": "датчик", "недопустимый": ложь, "атрибут": [{"параметр": "Входной ток", "значение": 1.14}, {"параметр": "Температура", "значение": 61,5} , {"параметр": "Входное напряжение", "значение": 54.777}]}}]}}"тип": "датчик", "недопустимый": ложь, "атрибут": [{"параметр": "Входной ток", "значение": 1.14}, {"параметр": "Температура", "значение": 61,5} , {"параметр": "Входное напряжение", "значение": 54.777}]}}]}}

код

      with open('Performance_Interface_data.json') as f:
    data = json.load(f)
df = pd.json_normalize(data['abcd-performance:output'], 'performance', max_level=4)
print(df.columns)
print(df)

Обязательные выходные данные: sample_objectId; sample_ifName; sample_timeStamp; sample_type; sample_invalid; sample_attribute_parameter; sample_attribute_value.

Я не могу выполнить нормализацию последнего столбца.

1 ответ

Вам нужно будет указать аргументы для meta а также record_path согласно JSON.

      df = pd.json_normalize(data['abcd-performance:output']['performance'], record_path=['sample','attribute'], meta=[['sample', 'objectId'], ['sample', 'ifName'], ['sample', 'timeStamp'], ['sample', 'type'], ['sample', 'invalid']])

In [50]: df
Out[50]: 
        parameter   value     sample.objectId sample.ifName          sample.timeStamp sample.type sample.invalid
0  rslReadingMean -36.400  abcd-device:100:12    Carrier1/1  2021-10-20T03:15:00.000Z       radio          False
1   qam-32rx_time   0.000  abcd-device:100:12    Carrier1/1  2021-10-20T03:15:00.000Z       radio          False
2  rslReadingMean -36.500  abcd-device:100:12    Carrier1/1  2021-10-20T03:30:00.000Z       radio          False
3   qam-32rx_time   0.000  abcd-device:100:12    Carrier1/1  2021-10-20T03:30:00.000Z       radio          False
4    InputCurrent   1.140  abcd-device:100:13      Terminal  2021-10-20T03:30:00.000Z      sensor          False
5     Temperature  61.500  abcd-device:100:13      Terminal  2021-10-20T03:30:00.000Z      sensor          False
6    InputVoltage  54.777  abcd-device:100:13      Terminal  2021-10-20T03:30:00.000Z      sensor          False
Другие вопросы по тегам