Table. TransformColumns

Accueil – Le CFO masqué Forums Power Query Table. TransformColumns

  • 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 9 mois et 3 semaines.
9 sujets de 1 à 9 (sur un total de 9)
  • Auteur
    Articles
  • #128982
    ludo.regnier
    Participant

    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 !

    #128983
    Stéphane Lorin
    Participant

    Bonjour

    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

    #128994
    ludo.regnier
    Participant

    MERCI !! 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

    #129695
    ludo.regnier
    Participant

    Bonjour
    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.

    #129721
    Stéphane Lorin
    Participant

    Bonjour
    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 colonne

    List.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

    #129750
    ludo.regnier
    Participant

    Bonjour
    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ée

    #129761
    Stéphane Lorin
    Participant

    La formule via le List.Accumulate est intéressante
    le temps de réponse est-il correct avec 10000 lignes ?
    Stéphane

    #129762
    ludo.regnier
    Participant

    Oui 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 !

    #129763
    Stéphane Lorin
    Participant

    Une 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 moi

    Code à 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ésultat

    Stéphane

9 sujets de 1 à 9 (sur un total de 9)
  • Vous devez être connecté pour répondre à ce sujet.