как извлечь некоторые данные из файла json с помощью python

#python #json

Вопрос:

У меня есть этот файл json:

 print(data)

{'entityId': 'clusterId123', 
'displayName': 'dev_cluster', 
'firstSeenTms': 1584113406351, 
'lastSeenTms': 1627524312116,  
'properties': {'detectedName': 'dev_cluster'}, 
'tags': [], 
'icon': {'primaryIconType': 'hypervisor'}, 
'toRelationships': {
    'isMemberOf': [
        {'id': 'HYPERVISOR_123', 'type': 'HYPERVISOR'}, 
        {'id': 'HYPERVISOR_234', 'type': 'HYPERVISOR'}, 
        {'id': 'HYPERVISOR_345', 'type': 'HYPERVISOR'}
        ]
    }
}
 

Мне нужно создать фрейм данных, который выглядит следующим образом:

 clusterId,  clusterName, hypervisorId
clusterId123 dev_cluster HYPERVISOR_123
clusterId123 dev_cluster HYPERVISOR_234
clusterId123 dev_cluster HYPERVISOR_345
 

как вы можете видеть, идентификатор кластера и имя кластера повторяются, но идентификатор гипервизора изменяется так же, как в файле данных.

Я делаю это:

 #create an empty list
 `cluList=[]`
#apend elements to the list
`cluList.append([data['entityId'], data['displayName']])`
 

Я не знаю, как извлечь ГИПЕРВИЗОР_123, ГИПЕРВИЗОР_234, ГИПЕРВИЗОР_345 из этих наборов данных. Любые рекомендации приветствуются.

Комментарии:

1. Это не JSON, это просто словарь Python

Ответ №1:

Используйте понимание под диктовку:

 import pandas as pd

data = {'entityId': 'clusterId123', 
'displayName': 'dev_cluster', 
'firstSeenTms': 1584113406351, 
'lastSeenTms': 1627524312116,  
'properties': {'detectedName': 'dev_cluster'}, 
'tags': [], 
'icon': {'primaryIconType': 'hypervisor'}, 
'toRelationships': {
    'isMemberOf': [
        {'id': 'HYPERVISOR_123', 'type': 'HYPERVISOR'}, 
        {'id': 'HYPERVISOR_234', 'type': 'HYPERVISOR'}, 
        {'id': 'HYPERVISOR_345', 'type': 'HYPERVISOR'}
        ]
    }
}

df = pd.DataFrame({
    "clusterId": data["entityId"],
    "clusterName": data["displayName"],
    "hypervisorId": _id["id"]
} for _id in data["toRelationships"]["isMemberOf"])

df
 

И результат:

     clusterId       clusterName   hypervisorId
0   clusterId123    dev_cluster   HYPERVISOR_123
1   clusterId123    dev_cluster   HYPERVISOR_234
2   clusterId123    dev_cluster   HYPERVISOR_345
 

Комментарии:

1. спасибо вам за ответ. Быстрый вопрос: если бы у меня был цикл, куча файлов данных, нужно ли мне добавлять их в пустой фрейм данных?

2. @user1471980 файлы данных? Не могли бы вы быть более конкретными?

Ответ №2:

Вы можете использовать понимание списка, которое зацикливается на isMemberOf списке.

 clulist = [(data['entityId'], data['displayName'], hypid) 
            for hypid in data['toRelationships']['isMemberOf']
        ]
 

Комментарии:

1. clulist будет списком типов? могу ли я сделать это для преобразования во фрейм данных (cluEntitydf=pd.DataFrame(cluList))?

2. Да, вы должны быть в состоянии это сделать.