J'ai deux fichiers avec des données de vente et je souhaite valider si les numéros de vente dans le premier fichier sont les mêmes que les numéros de vente dans le deuxième fichier. Mais l'ID de produit utilisé dans chaque fichier est différent. J'ai un 3ème fichier avec la correspondance entre l'ancien identifiant de produit et le nouvel identifiant de produit.
fichier de vente ancien p> nouveau fichier de vente p> et un ancien produit d'identifiant de produit / nouveau produit de correspondance : P> Product ID Store ID Week ID Sales Diff
X 1 201801 0
X 2 201801 0
X 2 201802 0
Y 1 201801 2
Y 2 201802 0
Y 3 201801 0
Z 2 201802 0
3 Réponses :
Voici une suggestion pour votre Nous utilisons votre troisième Dataframe comme dictionnaire pour alors nous faisons un si nous laissons vente em> en tant que clé Pandas code> approche. J'ai appelé votre ancien Dataframe
Old code> et votre nouveau Dataframe
Nouveau code>:
carte code>
L'ancien ID de produit code> aux nouveaux: p>
Fusionner gauche code>
sur les colonnes que vous souhaitez vérifier les modifications apportées. Remarque Une fusion de gauche vous donnera tous les matchs et les différences montreront dans nan code>. Dans ce cas, nous n'en avons pas: p>
code>, nous pouvons Comparez plus facilement en raison du
Suffixes code> argument: p>
$ cat tst.awk BEGIN { OFS="\t" } ARGIND==1 { map[$2] = $1; next } ARGIND==2 { old[$1,$2,$3] = $4; next } FNR==1 { gsub(/ +/,OFS); sub(/ *$/,"_Diff"); print; next } { print $1, $2, $3, $4 - old[map[$1],$2,$3] } $ awk -f tst.awk map old new | column -s$'\t' -t Product ID Store ID Week ID Sales_Diff X 1 201801 0 X 2 201801 0 X 2 201802 0 Y 1 201801 2 Y 2 201802 0 Y 3 201801 0 Z 2 201802 0 The above uses GNU awk for ARGIND. With other awks just add the line FNR==1 { ARGIND++ } just after the BEGIN line.
Je suis un fan de l'approche "Faites-le dans SQL", spécifiquement, SQLite:
$ ./report.sh old_sales.tsv new_sales.tsv product_mappings.tsv Product ID Store ID Week ID Sales Diff X 1 201801 0 X 2 201801 0 X 2 201802 0 Y 1 201801 2 Y 2 201802 0 Y 3 201801 0 Z 2 201802 0
Je ne pense pas que le traitement des tables de données relationnelles telles que des données relationnelles soit surchargée. J'utiliserais SQLite pour cela, mais la même idée.
Votre
Pandas code> L'approche semble raisonnable pour moi.
I Deuxième Quang, Pandas peut facilement gérer cela en fonction de la taille du fichier. Bien que SQL serait probablement mieux avec une procédure stockée de quelque sorte. Quelle est la taille de vos fichiers?
@Quanghoang environ 600m pour chaque fichier de vente. Le fichier de correspondance est un peu plus petit.