Nettoyage des données : comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?J'ai un fichier CSV exporté qui a été formé à partir de deux ou plusieurs sources différentes qui ont des noms de colonnes légèrement différents.
Aucune ligne ne contient de données dans plus d'une de ces colonnes. Comme dans la capture d'écran ci-dessous :

Comment puis-je les combiner tous dans une seule colonne ?
Une idée est d'utiliser
Combine Columns()
ce qui donnera une colonne à réponses multiples, mais comme les données ne se croisent pas, il n'y aura qu'un seul nombre dans toute la colonne. Forcez ensuite le type de données à Numérique et le type de modélisation à Continu. Mais cela produit un avertissement/une erreur.
Y a-t-il un moyen plus propre de faire ça ?
Automatisation et scriptsAnalyse et modélisation de données de baseRé : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?Je le gérerais de cette façon
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
:AA bb = Sum( :AA bb, :AA_bb_ )
);
L'utilisation de la fonction Sum() ignore les valeurs manquantes, vous obtiendrez donc les valeurs souhaitées.
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?Jim,
Merci beaucoup.
Je vais utiliser cette solution.
J'essaie maintenant de créer un script pour que les noms de colonnes ne soient pas codés en dur.
Je ne sais pas vraiment pourquoi j'obtiens une erreur à ce sujet :
For Each Row(
Column("AA bb") = 1234;
//Sum( :AA bb, :AA _bb_ )
);L'erreur est :
tentative d'affectation à un objet qui n'est pas une valeur L à la ligne 1 dans l'accès ou l'évaluation de 'Assign', Column( "AA bb" ) = /*###*/1234 /*###*/
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?L'idée est d'écrire une fonction et d'alimenter un dictionnaire vers cette fonction.
Quelque chose comme ça :
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row(
Column(dict[1]) = Sum( Column(dict[1]), Column(dict[2]) )
);Seule cette variante donne l'erreur suivante :
les arguments doivent être des scalaires, des matrices ou des listes à la ligne 1 lors de l'accès ou de l'évaluation de 'Sum', Sum/*###*/(Column( dict[1] ), Column( dict[2] ))
Je n'ai jamais réussi à comprendre que parfois Column() fonctionne comme prévu, parfois non. Parfois, j'ai besoin d'utiliser As Column(). Parfois, autre chose.
PS As Column() a fonctionné. Quelqu'un peut-il expliquer la différence entre Column() et As Column() ?
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?Ok, mon dernier extrait de code est ici :
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
);
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
);
Un moyen de l'améliorer ?
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?C'est un peu plus compliqué que nécessaire. Ce code fonctionne également, sans trop de réflexion. Il acceptera plus de deux noms de colonnes, au cas où cela serait souhaité.
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row( dt,
As Column(dict[1]) = Sum( Transform Each( {v, i}, dict, As Column( v ) ) )
);Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?Column() fait référence à l'objet colonne et As Column() fait référence à la valeur de cette colonne dans la ligne Row() actuelle.
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?Ma prochaine itération prend en compte un cas où le nom de la colonne est présent dans le dictionnaire, mais pas dans la table :
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
If( Try( Column( value ) << Get Name, "nocolumn" ) != "nocolumn",
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
)
);
Name Expr(sumExpr);
Try(
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
),
Write("No columns found")
)
Comment feriez-vous cela en utilisant Transformer chaque ?
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?Essayez d'utiliser l'outil de concaténation :
Créez une nouvelle colonne qui inclura les deux variables
Faites un clic droit sur la colonne
Sélectionnez Formule pour ouvrir l’éditeur de formules.
Dans l’éditeur de formules, accédez à la liste des fonctions sur la gauche.
Sous Caractère, recherchez et sélectionnez Concaténer.
Faites glisser ou sélectionnez la première colonne dans la première zone d’argument de la fonction Concaténer.
Faites glisser ou sélectionnez la deuxième colonne dans la zone d’argument suivante.
Cliquez sur OK ou Appliquer pour créer la nouvelle colonne combinée.
Ré : Nettoyage des données : Comment combiner plusieurs colonnes avec des noms légèrement différents et des données non croisées en une seule ?J'ajouterais simplement un Try().
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
For Each Row( dt, As Column( dict[1] ) = Sum( Transform Each( {v, i}, dict, Try( As Column( v ), . ) ) ) );