Problème list index out of range error

Résolu/Fermé
Antioche75 Messages postés 15 Date d'inscription jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022 - Modifié le 7 mars 2022 à 17:33
Antioche75 Messages postés 15 Date d'inscription jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022 - 8 mars 2022 à 10:17
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 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 Ambassadeur 1 538
Modifié le 7 mars 2022 à 14:01
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 jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022
7 mars 2022 à 13:46
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 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 538
7 mars 2022 à 14:03
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 jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022 > yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024
7 mars 2022 à 14:10
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 jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022 > Antioche75 Messages postés 15 Date d'inscription jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022
7 mars 2022 à 14:16
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 jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022 > Antioche75 Messages postés 15 Date d'inscription jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022
7 mars 2022 à 14:20
Ok je suis un peu rouillé, un simple dropna() devrait faire l'affaire, merci pour l'aide.
0
yg_be Messages postés 23235 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 30 septembre 2024 1 538 > Antioche75 Messages postés 15 Date d'inscription jeudi 3 mars 2022 Statut Membre Dernière intervention 8 mars 2022
7 mars 2022 à 21:53
moi j'ai simplement ajouté un test
if len(choices)>0:

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