Дублированные столбцы в Julia Dataframes

Aug 25 2020

В Python Pandas и R можно легко избавиться от повторяющихся столбцов - просто загрузите данные, назначьте имена столбцов и выберите те, которые не дублируются.

Как лучше всего работать с такими данными с помощью Julia Dataframes? Присвоение повторяющихся имен столбцов здесь не допускается. Я понимаю, что единственный способ - это еще больше массировать входящие данные и избавиться от них перед созданием Dataframe?

Дело в том, что почти всегда легче иметь дело с повторяющимися столбцами в уже созданном фрейме данных, чем во входящих данных.

UPD: Я имел в виду дублированные имена столбцов. Я строю фрейм данных из необработанных данных, где имена столбцов (и, следовательно, данные) могут повторяться.

UPD2: добавлен пример Python.

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

Я строю свой фрейм данных Julia из матрицы Float32, а затем назначаю имена столбцов из вектора. Вот где мне нужно избавиться от столбцов с повторяющимися именами (уже присутствующими в фрейме данных). Такова природа базовых данных, иногда они дублируются, иногда нет, я не могу контролировать их создание.

Ответы

2 BogumiłKamiński Aug 24 2020 at 23:38

Это то, что вы ищете (я не был уверен на 100% из вашего описания - если это не то, что вы хотите, обновите вопрос, добавив пример):

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     │

РЕДАКТИРОВАТЬ

Для дедупликации имен столбцов используйте makeuniqueаргумент ключевого слова:

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  │

ИЗМЕНИТЬ 2

Таким образом, у вас, похоже, есть доступ к именам столбцов при создании фрейма данных. В этом случае я бы сделал:

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     │