Exporter valeurs uniques (lignes) python panda excel
RésoluBonjour,
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)
4 réponses
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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.
-
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 singlesSi 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
- 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.
-
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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.
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
Travaille sur un cas très court.
Montre-nous ce qu'affiche ton code, et explique ce que tu souhaites qu'il affiche.
-
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
-
Pourquoi ne pas continuer dans cette discussion, avec un programme plus simple, et sans utiliser un fichier Excel.
-