1
resposta

[Dúvida] Dúvida json_normalize

Estou com um problema que algumas colunas estão aninhadas e mesmo usando o parâmetro record_path algumas colunas ainda continuam aninhadas. Como eu poderia usar o pandas.json_normalize e qual parametro correto a usar para conseuir desaninhar todas as colunas.

1 resposta

Para desaninhar todas as colunas em um objeto JSON, você pode usar o método pandas.json_normalize(). Vamos explorar como usá-lo e quais parâmetros são relevantes:

  1. data: Este é o objeto JSON que você deseja normalizar.
  2. record_path: O caminho para as listas aninhadas que você deseja desnormalizar. Isso é usado quando há listas dentro de listas. Se você quiser desaninhar todas as colunas, deixe esse parâmetro como None.
  3. meta: Campos para usar como metadados para cada registro na tabela resultante. Se você não precisa de metadados, deixe esse parâmetro como None.
  4. sep: Define o separador para os nomes das colunas geradas. O padrão é '.'.
  5. max_level: Define o número máximo de níveis (profundidade do dicionário) a serem normalizados. Se você deseja normalizar todos os níveis, deixe esse parâmetro como None.

Aqui estão alguns exemplos de uso:

  1. Normalizar dados JSON simples:

    import pandas as pd
    
    data = [
        {"id": 1, "name": {"first": "Coleen", "last": "Volk"}},
        {"name": {"given": "Mark", "family": "Regner"}},
        {"id": 2, "name": "Faye Raker"},
    ]
    
    df = pd.json_normalize(data)
    print(df)
    

    Isso criará um DataFrame com as colunas id, name.first, name.last, name.given e name.family.

  2. Normalizar dados JSON com níveis máximos:

    data = [
        {"id": 1, "name": "Cole Volk", "fitness": {"height": 130, "weight": 60}},
        {"name": "Mark Reg", "fitness": {"height": 130, "weight": 60}},
        {"id": 2, "name": "Faye Raker", "fitness": {"height": 130, "weight": 60}},
    ]
    
    df = pd.json_normalize(data, max_level=1)
    print(df)
    

    Isso criará um DataFrame com as colunas id, name, fitness.height e fitness.weight.

  3. Normalizar dados JSON com metadados:

    data = [
        {
            "state": "Florida",
            "shortname": "FL",
            "info": {"governor": "Rick Scott"},
            "counties": [
                {"name": "Dade", "population": 12345},
                {"name": "Broward", "population": 40000},
                {"name": "Palm Beach", "population": 60000},
            ],
        },
        {
            "state": "Ohio",
            "shortname": "OH",
            "info": {"governor": "John Kasich"},
            "counties": [
                {"name": "Summit", "population": 1234},
                {"name": "Cuyahoga", "population": 1337},
            ],
        },
    ]
    
    result = pd.json_normalize(data, "counties", ["state", "shortname", ["info", "governor"]])
    print(result)
    

    Isso criará um DataFrame com as colunas name, population, state, shortname e info.governor.

Espero que isso ajude a resolver o seu problema de aninhamento de colunas!