Exporter valeurs uniques (lignes) python panda excel

Résolu
peter76960 Messages postés 11 Date d'inscription vendredi 24 novembre 2023 Statut Membre Dernière intervention 22 juillet 2024 - Modifié le 22 juil. 2024 à 13:20
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 - 1 oct. 2024 à 17:09

Bonjour,

regarder script à partir de ( 

     for pn in liste2D:

but du jeu :obtenir des lignes à valeurs uniques

voir le fichier joint Feuil 1, ca fonctionne si je mets i=1 j'obtiens des lignes à valeur uniques normal i=1

Feuil 2 si je mets i=i+1 les lignes ne sont plus uniques

je souhaiterai:
obtenir le résultat de la Feuil3


j'ai essayé voir en gras mais ca ne fonctionne pas

 
for pn in liste2D:
    ligne = pn + ligne
    ligne.append(million)
    if pn[2] == '8Million_Kit':
        ligne.append(pn[1] + "-" + million + "-" + "B2B_8MillionKit")
    else:
        ligne.append(pn[1] + "-" + million + "-" + pn[2])
    if ligne not in unique_ligne:
        unique_ligne.append(ligne)
    <strong>unique_ligne.append(i)</strong>
    i = i+1
    ligne = []
import pandas as pd
import numpy as np
import openpyxl

""" on paramètre panda pour qu'il nous montre plus de colonne et lignes """
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 5000)

# Ouverture du fichier Excel
df1= dataframe_feuil1 = pd.read_excel('C:\\Users\\XXXXXX\\PycharmProjects\\pythonProject5\\PIM-creation\\Batch_OutputGenerated_creation.xlsx',engine='openpyxl',sheet_name='Feuil4')
df1['8million']=df1['8million'].astype(str).str.replace('.0','')
liste2D= [] # va être transformé en Dataframe après remplissage
listing=[]
ligne=[]
unique_ligne=[]
i=1
for index,row in dataframe_feuil1.iterrows():# parcourir ligne par ligne
    rangee = []# variable temporaire pour stocker les info de la ligne
    # construction de la rangée
    rangee.append('')
    if(isinstance(row['pn'],str)): # renvoi le PN kit si la cellule est vide ou non
        labelpn = row['pn']
    if(isinstance(row['kit'], str)):
        rangee.append(row['kit'])
    else:
        rangee.append(labelpn)
    if(isinstance(row['kit'], str)):
        label2='8Million_Kit'
        label3='Relate'
    else:
        label2=label2
        label3=label3
    if (isinstance(row['kit'], str)):
        rangee.append(label2)
    else:
        rangee.append(label3)
    if (isinstance(row['kit'], str)):
        rangee.append(row['n°série debut'])
        rangee.append(row['n°série fin'])
    else:
        rangee.append('')
        rangee.append('')
    liste2D.append(rangee)

liste_million=[]
unique_listing=[]
for index,row in dataframe_feuil1.iterrows():# parcourir ligne par ligne

    if(row['8million']!='nan'): # renvoi le PN kit si la cellule est vide ou non
        liste_million.append(row['8million'])
'''df1['start date']=df1['start date']- pd.to_timedelta(df1['start date']).dt.date'''
print(liste_million)
print('taille',len(liste_million)) # afficher liste
for million in liste_million:

    for pn in liste2D:
        ligne = pn + ligne
        ligne.append(million)
        if pn[2] == '8Million_Kit':
            ligne.append(pn[1] + "-" + million + "-" + "B2B_8MillionKit")
        else:
            ligne.append(pn[1] + "-" + million + "-" + pn[2])
        ligne.append(i)
        listing.append(ligne)
        i = i + 1
        ligne = []

print(listing)
print(unique_ligne)
df9b= pd.DataFrame(unique_ligne)
df9b.columns=["ProductRelationshipEntityType","PRChildProductId","PRType","B2B_SerialNumberRangeStart__c","B2B_SerialNumberRangeEnd__c","PRParentProductId","PRId","sequence"]
df9b.to_excel('Related3rdkit.xlsx',sheet_name='Feuil1',index=False)
A voir également:

4 réponses

yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
Modifié le 22 juil. 2024 à 17:51

Je pense que tu peux comprendre ton erreur en examinant attentivement ce que donne "print(unique_ligne)".

Ton erreur, c'est de faire

unique_ligne.append(ligne)

alors que ligne est une liste, et que tu modifies ensuite cette liste.

Regarde l'exemple ci-dessous:

input=[['a'],['b'],['c'],['a'],['d'],['b'],['e']]
connu=[]
output=[]
seq=1
for i in input:
    if i not in connu:
        connu.append(i)
        o=i.copy()
        o.append(seq)
        output.append(o)
        seq += 1
print("connu",connu)
print("input",input)
print("output",output)

Il fonctionne grâce au .copy() en ligne 8.  Il ne donne pas le résultat attendu si je fais simplement o=i en ligne 8.

1
mamiemando Messages postés 33372 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 novembre 2024 7 802
Modifié le 1 oct. 2024 à 17:09

Cette implémentation marche mais pose plusieurs problème en terme de performance qui la rendra difficilement utilisable pour de gros fichiers :

  • connu est une liste (vérification en O(n)), ce qui est bien moins performant qu'utiliser un ensemble (vérification en O(log(n)). Notons qu'utiliser des list-compréhension ou set-compréhension a un ici impact mineur en terme de performance mais est à mon avis plus élégant.
    import numpy as np
    np.random.seed(2)
    a = np.random.randint(0, 1000, size=1000)
    
    def drop_duplicates_list(a: iter) -> iter:
        singles = list()
        for x in a:
            if x not in singles:
                singles.append(x)
        return singles
    
    def drop_duplicates_set(a: iter) -> iter:
        singles = set()
        for x in a:
            if x not in singles:
                singles.add(x)
        return singles
    
    def drop_duplicates_list_comprehension(a: iter) -> iter:
        singles = list()
        for x in a:
            if x not in singles:
                singles.append(x)
        return singles
    
    def drop_duplicates_set_comprehension(a: iter) -> iter:
        singles = set()
        for x in a:
            if x not in singles:
                singles.add(x)
        return singles

    Si on teste ces fonctions dans jupyter avec %timeit ...

    %timeit drop_duplicates_list(a)
    %timeit drop_duplicates_set(a)
    %timeit drop_duplicates_list_comprehension(a)
    %timeit drop_duplicates_set_comprehension(a)

    ... voici ce qu'on obtient :

    4.18 ms ± 18.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    119 µs ± 7.09 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
    4.28 ms ± 141 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    124 µs ± 9.28 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

    On voit clairement que set est largement plus rapide. Et avec numpy  :

    %timeit np.unique(a)

    ... c'est encore plus rapide (car au lieu d'interpréter du code python, on passe par une librairie de calcul numérique optimisée) :

    29.9 µs ± 402 ns per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
  • puisque le code proposé passe par une pd.Dataframe, il vaut mieux utiliser utiliser pandas.DataFrame.drop_duplicates (qui en arrière boutique, va utiliser numpy)

Bonne chance

0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
22 juil. 2024 à 12:41

bonjour,

peux-tu partager ton code complet, en précisant bien "Python" dans la fénêtre de partage du code?

Il serait aussi utile de montrer la situation de départ.

0
peter76960 Messages postés 11 Date d'inscription vendredi 24 novembre 2023 Statut Membre Dernière intervention 22 juillet 2024
22 juil. 2024 à 13:36

j'ai indiqué Python dans la fenêtre de partage dans la rubrique poser votre question suite à votre retour, pas moyen de modifier mon ancien message

0
jee pee Messages postés 40470 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 23 novembre 2024 9 427 > peter76960 Messages postés 11 Date d'inscription vendredi 24 novembre 2023 Statut Membre Dernière intervention 22 juillet 2024
22 juil. 2024 à 13:41

Bonjour, tu as bien choisi le sous-forum Python, ce que @yg_be voulait signaler c'est, pour le code source, preciser en tête de la fenetre de saisie du code le langage python pour avoir la coloration syntaxique et numérotation de lignes. J'ai amendé ta question en ce sens.

0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
22 juil. 2024 à 15:22

Travaille sur un cas très court.

Montre-nous ce qu'affiche ton code, et explique ce que tu souhaites qu'il affiche.

0
peter76960 Messages postés 11 Date d'inscription vendredi 24 novembre 2023 Statut Membre Dernière intervention 22 juillet 2024
22 juil. 2024 à 17:19

Entendu je supprime mon msg et j'en crée un nouveau avec les bons intitulés, et un script plus court et plus simple

0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550
Modifié le 1 oct. 2024 à 16:51

Pourquoi ne pas continuer dans cette discussion, avec un programme plus simple, et sans utiliser un fichier Excel.

1