IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

extraction de données json vers pandas df avec erreurs variables [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    technique
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut extraction de données json vers pandas df avec erreurs variables
    Bonjour,

    je chercher à remplir des colonnes d'un dataframe avec les éléments de réponse d'un reverse geocodage une cellule json. Bref je récupère les champs qui m'intéressent du json pour les positionner dans le dataframe. étant donner que j'ai plusieurs champs à extraire je le fait à l'aide d'une boucle FOR, mais en fonction du fichier sources j'obtiens différentes exception? un coup : KeyError: 'housenumber' avec un autre fichier IndexError: list index out of range.

    je ne comprend pas pourquoi il existe des erreurs différentes d'un fichier source à l'autres et à quoi correspondent ces erreur, pouvez vous m'aider ?

    voici un exemple d'une ligne :
    {'type': 'FeatureCollection',
    'version': 'draft',
    'features': [{'type': 'Feature',
    'geometry': {'type': 'Point', 'coordinates': [-1.58203, 47.206115]},
    'properties': {'label': '41 bis Rue de la Bourdonnais 44100 Nantes',
    'score': 0.9999999987671132,
    'housenumber': '41 bis',
    'id': '44109_4737_00041_bis',
    'type': 'housenumber',
    'x': 353350.67,
    'y': 6688485.23,
    'importance': 0.6114075230200428,
    'name': '41 bis Rue de la Bourdonnais',
    'postcode': '44100',
    'citycode': '44109',
    'city': 'Nantes',
    'context': '44, Loire-Atlantique, Pays de la Loire',
    'street': 'Rue de la Bourdonnais',
    'distance': 1}}],
    'attribution': 'BAN',
    'licence': 'ETALAB-2.0',
    'limit': 1}
    le code que j'utilise est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    df = pd.read_excel(f'{path}/{file}{extension}')
     
    for idx, row in df.iterrows():
        df.loc[idx,'adresse'] = json.loads(row['reponse'])['features'][0]['properties']['label']
        df.loc[idx,'housenumber'] = json.loads(row['reponse'])['features'][0]['properties']['housenumber']
        df.loc[idx,'street'] = json.loads(row['reponse'])['features'][0]['properties']['street']
    et en fonction du fichier source j'ai plusieurs erreur possible :


    ---------------------------------------------------------------------------
    KeyError Traceback (most recent call last)
    <ipython-input-46-3de1e7042c05> in <module>
    8 for idx, row in df.iterrows():
    9 df.loc[idx,'adresse'] = json.loads(row['reponse'])['features'][0]['properties']['label']
    ---> 10 df.loc[idx,'housenumber'] = json.loads(row['reponse'])['features'][0]['properties']['housenumber']
    11 df.loc[idx,'street'] = json.loads(row['reponse'])['features'][0]['properties']['street']
    12 df.loc[idx,'postcode'] = json.loads(row['reponse'])['features'][0]['properties']['postcode']

    KeyError: 'housenumber'
    ou

    ---------------------------------------------------------------------------
    IndexError Traceback (most recent call last)
    <ipython-input-51-fee091838b27> in <module>
    7
    8 for idx, row in df.iterrows():
    ----> 9 df.loc[idx,'adresse'] = json.loads(row['reponse'])['features'][0]['properties']['label']
    10 df.loc[idx,'housenumber'] = json.loads(row['reponse'])['features'][0]['properties']['housenumber']
    11 df.loc[idx,'street'] = json.loads(row['reponse'])['features'][0]['properties']['street']

    IndexError: list index out of range

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 738
    Par défaut
    Salut,

    Citation Envoyé par 20dxxx Voir le message
    je ne comprend pas pourquoi il existe des erreurs différentes d'un fichier source à l'autres et à quoi correspondent ces erreur, pouvez vous m'aider ?
    JSON est une structure composite de listes et de dictionnaires (un arbre) sous la forme d'un texte (chaine de caractères) que json.loads transforme en structure composite d'objets Python.

    Accéder à ['features'][0]['properties']['housenumber'] suppose que la clef 'features' existe et contient bien une liste dont le premier élément est un dictionnaire avec à une clef 'properties'....

    Si çà plante, c'est à priori que vos JSON sont de types différents: ils n'ont pas la même structure. L'information si elle existe doit être cherchée autrement.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    bm
    bm est déconnecté
    Membre extrêmement actif

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Billets dans le blog
    6
    Par défaut
    Pandas traite des data hétérogènes dans un fichier, et bien souvent des data manquantes.

    Différents json mal configurés, c'est un silo de data pas exploitable.

    Et Pandas ne fera pas des miracles.

  4. #4
    Membre averti
    Homme Profil pro
    technique
    Inscrit en
    Décembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : technique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2013
    Messages : 12
    Par défaut une solution possible
    Bonjour,

    merci pour votre aide, je viens de modifier mon code afin qu'il gère les exceptions et mette des lignes vides lorsqu'il y a eu un problème dans le retour json.

    voila ce que ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    path = 'C:/Users/id1015/Documents/Données/QE/queops'
    file = 'MEETIQUE_29019_wgs_revgeo'
    extension = '.xlsx'
     
     
    df = pd.read_excel(f'{path}/{file}{extension}')
     
    for idx, row in df.iterrows():
     
        try:
            df.loc[idx,'adresse'] = json.loads(row['reponse'])['features'][0]['properties']['label']
            df.loc[idx,'housenumber'] = json.loads(row['reponse'])['features'][0]['properties']['housenumber']
            df.loc[idx,'street'] = json.loads(row['reponse'])['features'][0]['properties']['street']
            df.loc[idx,'postcode'] = json.loads(row['reponse'])['features'][0]['properties']['postcode']
            df.loc[idx,'city'] = json.loads(row['reponse'])['features'][0]['properties']['city']
            df.loc[idx,'insee'] = json.loads(row['reponse'])['features'][0]['properties']['citycode']
            df.loc[idx,'id_adr'] = json.loads(row['reponse'])['features'][0]['properties']['id']
            df.loc[idx,'score'] = json.loads(row['reponse'])['features'][0]['properties']['score']
            df.loc[idx,'type'] = json.loads(row['reponse'])['features'][0]['properties']['type']
            df.loc[idx,'x_l93'] = json.loads(row['reponse'])['features'][0]['properties']['x']
            df.loc[idx,'y_l93'] = json.loads(row['reponse'])['features'][0]['properties']['y']
            df.loc[idx,'distance'] = json.loads(row['reponse'])['features'][0]['properties']['distance']
     
        except (KeyError, IndexError):
            df.loc[idx,'adresse'] = np.nan
            df.loc[idx,'housenumber'] = np.nan
            df.loc[idx,'street'] = np.nan
            df.loc[idx,'postcode'] = np.nan
            df.loc[idx,'city'] = np.nan
            df.loc[idx,'insee'] = np.nan
            df.loc[idx,'id_adr'] = np.nan
            df.loc[idx,'score'] = np.nan
            df.loc[idx,'type'] = np.nan
            df.loc[idx,'x_l93'] = np.nan
            df.loc[idx,'y_l93'] = np.nan
            df.loc[idx,'distance'] = np.nan
     
    df.to_excel(f'{path}/{file}_comp{extension}',index=False)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/10/2012, 15h44
  2. extraction de données xml vers excel (VBA)
    Par gibba88 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 25/04/2012, 11h33
  3. extraction de données et chargement de cube avec talend
    Par ipfake dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 26/01/2011, 15h58
  4. Réponses: 2
    Dernier message: 02/12/2009, 15h26
  5. Extraction de données xml sur un serveur avec extjs
    Par dasdo dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 30/07/2009, 20h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo