Accueil – Le CFO masqué › Forums › Power Query › Table. TransformColumns
Mots-clés : Table. Transform Columns et multiplication
- Ce sujet contient 8 réponses, 2 participants et a été mis à jour pour la dernière fois par Stéphane Lorin, le il y a 1 année et 3 mois.
-
AuteurArticles
-
4 juin 2023 à 15 h 55 min #128982ludo.regnierParticipant
Bonjour
J’ai une table avec de nombreuses colonnes et je voudrai faire qqch qui me paraît pourtant simple….
Je determine une liste parmi ces colonnes et je souhaite que chaque valeur dans chaque colonne de la liste soit multipliée par la valeur de la même ligne contenu dans une autre colonne de la table. Par exemple j’ai 35 colonnes C1 à C35 et une colonne M. Je crée une liste contenant les colonnes C4, C8, et C32 et je voudrai transformer les valeurs en les multipliant par les valeurs de M (M est toujours là même colonne multiplicative). Le Table. Transform Columns me paraissait bien mais je ne m’en sors pas avec les notions de liste de listes. Pfff 😱
Merci d’avance si vous pouvez m’aider !5 juin 2023 à 5 h 56 min #128983Stéphane LorinParticipantBonjour
je trouve que c’est plus “simple” avec Table.ReplaceValue qu’avec TransformColumns
= Table.ReplaceValue(Source, each [M], null, (x,y,z)=>x*y, {“C4”, “C8”, “C32”})
x = successivement les valeurs [C4], [C8] et [C32]
y = la valeur [M] de la ligne
z = null (ne sert pas ici)Stéphane
5 juin 2023 à 12 h 11 min #128994ludo.regnierParticipantMERCI !! C’est exactement ce que je cherchais. Et c’est effectivement plus “léger” que les each liste de liste de Table. Transform Columns. 😁 Merci encore et bonne journée
2 juillet 2023 à 5 h 23 min #129695ludo.regnierParticipantBonjour
Merci encore à Stéphane pour sa réponse. Je cherche maintenant à complexifier un peu ma requête :est-ce possible de rendre la colonne [M] paramétrable également ? En effet j’ai deux listes de colonnes qui fonctionnent par paire ([A] et [A. 1], [B] et [B. 1]) etc. et je souhaite faire un remplacement conditionnel : si valeur en colonne [A] <x alors [A] sinon [A] *[A. 1], si [B] <x alors [B] sinon [B] *[B. 1], si [C] <x alors [C] sinon [C] *[C. 1] etc pour l’ensemble des valeurs de la liste à transformer.Un grand merci par avance si vous pouvez m’aider.
4 juillet 2023 à 6 h 12 min #129721Stéphane LorinParticipantBonjour
J’ai déjà essayé d’utiliser Table.ReplaceValue pour faire ce genre de manipulation mais ça ne fonctionne pas. Il faut autant d’étapes que de couple de colonnes A A1, B B1, …Sûrement possible en manipulant des listes
Par exemple avec une nouvelle colonneList.Transform(List.Zip({{[A],[B],[C]}, {[A1],[B1],[C1]}}), each if _{0} < x then _{0} else _{0} * _{1} )
pour obtenir une liste avec les nouvelles valeurs de A, B et C suivant si elles sont inférieures ou non à x
Pourquoi ne pas dépivoter toutes les colonnes et travailler sur les nouvelles colonnes “Attribut” et “Valeur” ?
Stéphane
4 juillet 2023 à 17 h 49 min #129750ludo.regnierParticipantBonjour
Merci Stéphane pour cette nouvelle réponse. J’avais effectivement commencé par dépivoter mes colonnes pour travailler avec Attribut et Valeur, mais comme j’ai de nombreuses colonnes à dépivoter puis re-pivoter et environ 10000 lignes dans ma table source je me retrouvais avec des performances très mauvaises. C’est pourquoi je cherchais une solution qui m’évite de dépivoter (pensant que c’est la raison principale des mauvaises performances). Un collègue m’a aidé à adapter la formule Table.ReplaceValue en l’intégrant dans une “List.Accumulate”. Voici le résultat avec une condition si null : “si valeur en colonne A est null, remplacer par la valeur en colonne A. 1, si valeur en colonne B est null, remplacer par la valeur en colonne B. 1” etc.
Les colonnes contenant les valeurs à remplacer sont identifiées dans la liste col_a_remplacer de la fonction, et toutes les colonnes contenant les valeurs de remplacement sont nommées comme les colonnes à remplacer plus le suffixe “. 1”.
La formule permet de complexifier la condition en utilisant la variable b par exemple.List.Accumulate( col_a_remplacer, ma_table_source, (state, current) => Table.ReplaceValue=(state,0, each Record.Field(_,current & “. 1”), (a, b, c) as number => if a = null then c else a, {current}))
Il serait également possible de remplacer la condition
if a = null then c else a
par
a?? c
Je n’ai pas essayé
bonne journée5 juillet 2023 à 10 h 06 min #129761Stéphane LorinParticipantLa formule via le List.Accumulate est intéressante
le temps de réponse est-il correct avec 10000 lignes ?
Stéphane5 juillet 2023 à 10 h 23 min #129762ludo.regnierParticipantOui globalement en changeant d’approche (en évitant de pivoter dépivoter) je suis passé d’un temps de réponse de 19 minutes !!) à 6 minutes max. Ça devient opérationnel !
5 juillet 2023 à 13 h 04 min #129763Stéphane LorinParticipantUne autre approche en transformant les lignes via des listes
testé sur 10000 lignes et 10 colonnes de A à K et 10 colonnes de A.1 à K.1
quelques secondes chez moiCode à copier dans une nouvelle requête
let
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText(“VVNbEsQgCLtLv/sh4Ktn6ez9r7ESCWNndqkCQhL0fS+r133VZ5n1s+kb/+t2IGDiKwnP3F/4zKOer5PGigfa9btfpA8PNA8MRg1b40p85X20Mk1LuA5sSoyK2pZwn8CMjR+UmQbt4pzniPPS8EhfpjMXjRcjL96PfgDvcfSpydiyNwoPHrGeetRg0PMbqmxcyBksE/pGrqDHKbwFDsglwbeVDQCKgLGw/PxgFvaS9CNLlVWwRTNpSajsnisBHfqXc0RRA7AwVNSwfqDWHA2kkA+TtmOhDC6I5jw2p7iM4Iab+RAgzCGSxGiVTLfkENKeA5IlZQzSosUeR6EZPNZD0LxHMWTeck2qdgBCfbLlk2qBfz8eFvSjHP16PL8/”, BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [A = _t, A.1 = _t, B = _t, B.1 = _t, C = _t, C.1 = _t, D = _t, D.1 = _t, E = _t, E.1 = _t, F = _t, F.1 = _t, G = _t, G.1 = _t, I = _t, I.1 = _t, J = _t, J.1 = _t, K = _t, K.1 = _t]),
Liste_Colonne = List.Select(Table.ColumnNames(Source), each not Text.Contains(_,”.”)),
Liste_Colonne.1 = List.Select(Table.ColumnNames(Source), each Text.Contains(_,”.”)),
Null = Table.ReplaceValue(Source,””,null,Replacer.ReplaceValue,Liste_Colonne&Liste_Colonne.1),
Repeat1000 = Table.Repeat(Null,1000),
Table.Colonnes = Table.ToRows(Table.SelectColumns(Repeat1000,Liste_Colonne)),
Table.Colonnes.1 = Table.ToRows(Table.SelectColumns(Repeat1000,Liste_Colonne.1)),
Transform = List.Transform(List.Zip({Table.Colonnes,Table.Colonnes.1}), (x) => List.Transform(List.Positions(x{0}), each x{0}{_}??x{1}{_} )),
Résultat = Table.FromRows(Transform, Liste_Colonne)
in
RésultatStéphane
-
AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.