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:
Exporter valeurs uniques (lignes) python panda excel
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 singles
Si on teste ces fonctions dans jupyter avec %timeit ...
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)
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.
Cette implémentation marche mais pose plusieurs problème en terme de performance qui la rendra difficilement utilisable pour de gros fichiers :
Si on teste ces fonctions dans jupyter avec %timeit ...
... voici ce qu'on obtient :
On voit clairement que set est largement plus rapide. Et avec numpy :
... 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) :
Bonne chance