Объедините коллекцию DataFrames в один большой DataFrame - PullRequest
2 голосов
/ 30 мая 2020

Предположим, у меня есть 3 фрейма данных. Один такой DataFrame имеет имя столбца, которого нет в двух других.

using DataFrames

df1 = DataFrame([['a', 'b', 'c'], [1, 2, 3]], ["name", "id"])
df2 = DataFrame([['d', 'e', 'f'], [4, 5, 6]], ["name", "id"])
df3 = DataFrame([['x', 'y', 'z'], [7, 8, 9], [11, 22, 33]], ["name", "id", "num"])

И каждый DataFrame является элементом вектора.

dfs = [df1, df2, df3]

Я хочу объединить все эти DataFrame в один большой DataFrame. Вот что я пробовал:

df = reduce(x -> vcat(x, cols=:union), dfs)
# MethodError: no method matching (::var"#55#56")(::DataFrame, ::DataFrame)

Итак, как мне это сделать в Юлии?

Бонусные баллы: Могу ли я сделать это на базе Юлии, без DataFrames.jl (примечание: df3 имеет больше столбцов, чем другие)?

Поскольку существует множество пакетов Julia, реализующих конструкции, подобные DataFrame, я открыт для решений, использующих пакеты, отличные от DataFrames.jl.


Вот как бы я сделал это в R:

df1 = data.frame(name = c("a", "b", "c"),
                 id = c(1, 2, 3))

df2 = data.frame(name = c("d", "e", "f"),
                 id = c(4, 5, 6))

df3 = data.frame(name = c("x", "y", "z"),
                 id = c(7, 8, 9),
                 num = c(11, 22, 33))

dfs = list(df1, df2, df3)

library(dplyr)
dplyr::bind_rows(dfs)

и Python 3.7:

import pandas as pd

df1 = pd.DataFrame({"name": ["a", "b", "c"],
                    "id": [1, 2, 3]})

df2 = pd.DataFrame({"name": ["d", "e", "f"],
                    "id": [4, 5, 6]})

df3 = pd.DataFrame({"name": ["x", "y", "z"],
                    "id": [7, 8, 9],
                    "num": [11, 22, 33]})

dfs = [df1, df2, df3]

pd.concat(dfs)

1 Ответ

4 голосов
/ 30 мая 2020

Просто сделайте:

julia> vcat(dfs..., cols=:union)
9×3 DataFrame
│ Row │ name │ id    │ num     │
│     │ Char │ Int64 │ Int64?  │
├─────┼──────┼───────┼─────────┤
│ 1   │ 'a'  │ 1     │ missing │
│ 2   │ 'b'  │ 2     │ missing │
│ 3   │ 'c'  │ 3     │ missing │
│ 4   │ 'd'  │ 4     │ missing │
│ 5   │ 'e'  │ 5     │ missing │
│ 6   │ 'f'  │ 6     │ missing │
│ 7   │ 'x'  │ 7     │ 11      │
│ 8   │ 'y'  │ 8     │ 22      │
│ 9   │ 'z'  │ 9     │ 33      │

или

julia> reduce(vcat, dfs, cols=:union)
9×3 DataFrame
│ Row │ name │ id    │ num     │
│     │ Char │ Int64 │ Int64?  │
├─────┼──────┼───────┼─────────┤
│ 1   │ 'a'  │ 1     │ missing │
│ 2   │ 'b'  │ 2     │ missing │
│ 3   │ 'c'  │ 3     │ missing │
│ 4   │ 'd'  │ 4     │ missing │
│ 5   │ 'e'  │ 5     │ missing │
│ 6   │ 'f'  │ 6     │ missing │
│ 7   │ 'x'  │ 7     │ 11      │
│ 8   │ 'y'  │ 8     │ 22      │
│ 9   │ 'z'  │ 9     │ 33      │
...