Problème list index out of range error

Résolu
Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -  
Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je cherche à obtenir une liste de marques et de modèles de bateaux clean à partir d'un premier dataset saisi à la main avec des erreurs, le deuxième provenant d'une base de données maritime, avec un module de levensthein (fuzzywuzzy), seulement j'obtiens un message d'erreur relatif à un problème d'index que je ne comprends pas

Les deux datasets :

https://www.transfernow.net/en/dltransfer?utm_source=202203070QxpVjYJ

Mon code :
 #%%
from fuzzywuzzy import process
import pandas as pd

#%%
BASE_LAMBDA_PATH = '../ressources/marques_modeles_lambda_entier.csv'
BASE_REF_PATH = '../ressources/marques_modeles_ref_entier.csv'
#%%
lambda_df = pd.read_csv(BASE_LAMBDA_PATH, sep=";")
#%%
ref_df = pd.read_csv(BASE_REF_PATH, sep=";")

#%% j'ai créé ma liste de résultat (initée à vide)
df_result = pd.DataFrame(columns=['marque', 'lambda','ref','score'])

#%% je parcours ma table de modèles lambda
for ind in lambda_df.index:
    marque = lambda_df['MARQUE_REF'][ind]
    modele_lambda = lambda_df['MODELE'][ind]
    ref_list = (ref_df[(ref_df['lib_marque'] == marque)]['lib_model']).to_list()
    choices = process.extract(modele_lambda, ref_list, limit=1)
    approx = choices[0][0]
    score = choices[0][1]
    df2 = pd.DataFrame(data = [(marque, modele_lambda, approx, score)],\
         columns=['marque', 'lambda','ref','score'])
    df_result = pd.concat([df_result, df2], axis=0, ignore_index=True)

df_result.to_csv('output_matching_groupe.csv', sep=';', index=False)

'''
tdep = time.time()
tfin = time.time()
print(f"duree de {tfin-tdep} secondes")
'''
# %%

Le message d'erreur :
  IndexError                                Traceback (most recent call last)
c:\Users\boats\src\list_matching_groupe.py in <cell line: 1>()
20 ref_list = (ref_df[(ref_df['lib_marque'] == marque)]['lib_model']).to_list()
21 choices = process.extract(modele_lambda, ref_list, limit=1)
----> 22 approx = choices[0][0]
23 score = choices[0][1]
24 df2 = pd.DataFrame(data = [(marque, modele_lambda, approx, score)],\
25 columns=['marque', 'lambda','ref','score'])

IndexError: list index out of range

Je ne comprends pas par ce que
choices[0][0
] fonctionne puisque j'obtiens:
'Guy Couach 1401'

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
quand tu utilises les balises de code, peux-tu préciser le langage? https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

je suggères que tu ajoutes un print() avant la ligne qui te donne une erreur:
print(type(choices),choices)

je pense que cela t'aidera à comprendre ce que fait ton code.
0
Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
Désolé pour les balises de code, il s'agit de Python,


Je viens de faire comme suggéré:

#%% j'ai créé ma liste de résultat (initée à vide)
df_result = pd.DataFrame(columns=['marque', 'lambda','ref','score'])

#%% je parcours ma table de modèles lambda
for ind in lambda_df.index:
    marque = lambda_df['MARQUE_REF'][ind]
    modele_lambda = lambda_df['MODELE'][ind]
    ref_list = (ref_df[(ref_df['lib_marque'] == marque)]['lib_model']).to_list()
    print(type(choices),choices)
    choices = process.extract(modele_lambda, ref_list, limit=1)
    approx = choices[0][0]
    score = choices[0][1]
    df2 = pd.DataFrame(data = [(marque, modele_lambda, approx, score)],\
         columns=['marque', 'lambda','ref','score'])
    df_result = pd.concat([df_result, df2], axis=0, ignore_index=True)

df_result.to_csv('output_matching_groupe.csv', sep=';', index=False)

'''
tdep = time.time()
tfin = time.time()
print(f"duree de {tfin-tdep} secondes")
'''
# %%


<class 'list'> [('Guy Couach 1401', 90)]
<class 'list'> [('Guy Couach 1401', 90)]
<class 'list'> [('Bluewater 2460', 100)]
<class 'list'> [('Windy 46 Chinook', 90)]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [55], in <module>
      9 print(type(choices),choices)
     10 choices = process.extract(modele_lambda, ref_list, limit=1)
---> 11 approx = choices[0][0]
     12 score = choices[0][1]
     13 df2 = pd.DataFrame(data = [(marque, modele_lambda, approx, score)],\
     14      columns=['marque', 'lambda','ref','score'])

IndexError: list index out of range
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
la ligne print() est trop haut, elle doit précéder la ligne qui donne une erreur.
0
Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Je n'ai malheureusement pas l'impression que cela change grand chose, ou du moins je ne comprends pas ce
<class 'list'> []


#%% j'ai créé ma liste de résultat (initée à vide)
df_result = pd.DataFrame(columns=['marque', 'lambda','ref','score'])

#%% je parcours ma table de modèles lambda
for ind in lambda_df.index:
    marque = lambda_df['MARQUE_REF'][ind]
    modele_lambda = lambda_df['MODELE'][ind]
    ref_list = (ref_df[(ref_df['lib_marque'] == marque)]['lib_model']).to_list()
    choices = process.extract(modele_lambda, ref_list, limit=1)
    print(type(choices),choices)
    approx = choices[0][0]
    score = choices[0][1]
    df2 = pd.DataFrame(data = [(marque, modele_lambda, approx, score)],\
         columns=['marque', 'lambda','ref','score'])
    df_result = pd.concat([df_result, df2], axis=0, ignore_index=True)

df_result.to_csv('output_matching_groupe.csv', sep=';', index=False)

'''
tdep = time.time()
tfin = time.time()
print(f"duree de {tfin-tdep} secondes")
'''
# %%


<class 'list'> [('Guy Couach 1401', 90)]
<class 'list'> [('Bluewater 2460', 100)]
<class 'list'> [('Windy 46 Chinook', 90)]
<class 'list'> []
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Input In [58], in <module>
      9 choices = process.extract(modele_lambda, ref_list, limit=1)
     10 print(type(choices),choices)
---> 11 approx = choices[0][0]
     12 score = choices[0][1]
     13 df2 = pd.DataFrame(data = [(marque, modele_lambda, approx, score)],\
     14      columns=['marque', 'lambda','ref','score'])

IndexError: list index out of range
0
Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   > Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
Je crois avoir compris, c'est dû aux lignes vides ou partiellement vides dans le dataset (présence uniquement d'une marque ou d'un modèle:

MARQUE_REF	MODELE
Guy Couach 1401
Karnic BLUEWATER 2460
Windy 46 CHINOOK

Absolute NAVETTA 52
SLOOP
Clear AQUARIUS OPEN



Comment puis je efface les lignes vides / partiellement vides pour pallier à cela?
0
Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention   > Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
Ok je suis un peu rouillé, un simple dropna() devrait faire l'affaire, merci pour l'aide.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Antioche75 Messages postés 15 Date d'inscription   Statut Membre Dernière intervention  
 
moi j'ai simplement ajouté un test
if len(choices)>0:

pour éviter de traiter cette donnée, et passer à la suivante.
1