Colonnes dupliquées dans Julia Dataframes
Dans Python Pandas et R, on peut facilement se débarrasser des colonnes dupliquées - il suffit de charger les données, d'attribuer les noms de colonnes et de sélectionner celles qui ne sont pas dupliquées.
Quelles sont les meilleures pratiques pour traiter ces données avec Julia Dataframes? L'attribution de noms de colonne dupliqués n'est pas autorisée ici. Je comprends que le seul moyen serait de masser davantage les données entrantes et de se débarrasser de ces données avant de construire un Dataframe?
Le fait est qu'il est presque toujours plus facile de traiter les colonnes dupliquées dans la trame de données déjà construite, plutôt que dans les données entrantes.
UPD: Je voulais dire les noms de colonnes dupliqués. Je construis des dataframe à partir de données brutes, où les noms de colonnes (et donc les données) peuvent être répétés.
UPD2: exemple Python ajouté.
>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame(np.hstack([np.zeros((4,1)), np.ones((4,2))]), columns=["a", "b", "b"])
>>> df
a b b
0 0.0 1.0 1.0
1 0.0 1.0 1.0
2 0.0 1.0 1.0
3 0.0 1.0 1.0
>>> df.loc[:, ~df.columns.duplicated()]
a b
0 0.0 1.0
1 0.0 1.0
2 0.0 1.0
3 0.0 1.0
Je construis mon Julia Dataframe à partir d'une matrice Float32, puis j'attribue des noms de colonnes à partir d'un vecteur. C'est là que je dois me débarrasser des colonnes qui ont des noms en double (déjà présents dans dataframe). Telle est la nature des données sous-jacentes, parfois il y a des dups, parfois pas, je n'ai aucun contrôle sur sa création.
Réponses
Est-ce quelque chose que vous recherchez (je n'étais pas sûr à 100% de votre description - si ce n'est pas ce que vous voulez, veuillez mettre à jour la question avec un exemple):
julia> df = DataFrame([zeros(4,3) ones(4,5)])
4×8 DataFrame
│ Row │ x1 │ x2 │ x3 │ x4 │ x5 │ x6 │ x7 │ x8 │
│ │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │ Float64 │
├─────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ 1 │ 0.0 │ 0.0 │ 0.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │
│ 2 │ 0.0 │ 0.0 │ 0.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │
│ 3 │ 0.0 │ 0.0 │ 0.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │
│ 4 │ 0.0 │ 0.0 │ 0.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │ 1.0 │
julia> DataFrame(unique(last, pairs(eachcol(df))))
4×2 DataFrame
│ Row │ x1 │ x4 │
│ │ Float64 │ Float64 │
├─────┼─────────┼─────────┤
│ 1 │ 0.0 │ 1.0 │
│ 2 │ 0.0 │ 1.0 │
│ 3 │ 0.0 │ 1.0 │
│ 4 │ 0.0 │ 1.0 │
ÉDITER
Pour dédupliquer les noms de colonne, utilisez l' makeuniqueargument mot-clé:
julia> DataFrame(rand(3,4), [:x, :x, :x, :x], makeunique=true)
3×4 DataFrame
│ Row │ x │ x_1 │ x_2 │ x_3 │
│ │ Float64 │ Float64 │ Float64 │ Float64 │
├─────┼───────────┼──────────┼──────────┼───────────┤
│ 1 │ 0.410494 │ 0.775563 │ 0.819916 │ 0.0520466 │
│ 2 │ 0.0503997 │ 0.427499 │ 0.262234 │ 0.965793 │
│ 3 │ 0.838595 │ 0.996305 │ 0.833607 │ 0.953539 │
MODIFIER 2
Vous semblez donc avoir accès aux noms de colonnes lors de la création d'un bloc de données. Dans ce cas, je ferais:
julia> mat = [ones(3,1) zeros(3,2)]
3×3 Array{Float64,2}:
1.0 0.0 0.0
1.0 0.0 0.0
1.0 0.0 0.0
julia> cols = ["a", "b", "b"]
3-element Array{String,1}:
"a"
"b"
"b"
julia> df = DataFrame(mat, cols, makeunique=true)
3×3 DataFrame
│ Row │ a │ b │ b_1 │
│ │ Float64 │ Float64 │ Float64 │
├─────┼─────────┼─────────┼─────────┤
│ 1 │ 1.0 │ 0.0 │ 0.0 │
│ 2 │ 1.0 │ 0.0 │ 0.0 │
│ 3 │ 1.0 │ 0.0 │ 0.0 │
julia> select!(df, unique(cols))
3×2 DataFrame
│ Row │ a │ b │
│ │ Float64 │ Float64 │
├─────┼─────────┼─────────┤
│ 1 │ 1.0 │ 0.0 │
│ 2 │ 1.0 │ 0.0 │
│ 3 │ 1.0 │ 0.0 │