Объединение нескольких фреймов данных

#dataframe #julia

#Фрейм данных #Джулия

Вопрос:

Мне интересно, есть ли в Julia DataFrames способ объединить несколько фреймов данных за один раз,

  using DataFrames

 employer = DataFrame(
    ID = Array{Int64}([01,02,03,04,05,09,11,20]),
    name = Array{String}(["Matthews","Daniella", "Kofi", "Vladmir", "Jean", "James", "Ayo", "Bill"])
    )

salary = DataFrame(
    ID = Array{Int64}([01,02,03,04,05,06,08,23]),
    amount = Array{Int64}([2050,3000,3500,3500,2500,3400,2700,4500])
)

hours = DataFrame(
    ID = Array{Int64}([01,02,03,04,05,08,09,23]),
    time = Array{Int64}([40,40,40,40,40,38,45,50])
)

# I tried adding them in an array but ofcoures that results in an error
empSalHrs = innerjoin([employer,salary,hours], on = :ID)

# In python you can achieve this using
import pandas as pd 
from functools import reduce

df = reduce(lambda l,r : pd.merge(l,r, on = "ID"), [employer, salary, hours])
 

Есть ли аналогичный способ сделать это в julia?

Ответ №1:

Вы были почти на месте. Как написано в руководстве DataFrames.jl, вам просто нужно передать более одного фрейма данных в качестве аргумента.

 using DataFrames

 employer = DataFrame(
    ID = [01,02,03,04,05,09,11,20],
    name = ["Matthews","Daniella", "Kofi", "Vladmir", "Jean", "James", "Ayo", "Bill"])
    

salary = DataFrame(
    ID = [01,02,03,04,05,06,08,23],
    amount = [2050,3000,3500,3500,2500,3400,2700,4500])


hours = DataFrame(
    ID = [01,02,03,04,05,08,09,23],
    time = [40,40,40,40,40,38,45,50]
)

empSalHrs = innerjoin(employer,salary,hours, on = :ID)
 

Если по какой-то причине вам нужно поместить свои фреймы данных в a Vector , вы можете использовать разделение для достижения того же результата

 empSalHrs = innerjoin([employer,salary,hours]..., on = :ID)
 

Также обратите внимание, что я немного изменил определения фреймов данных. Поскольку Array{Int} это абстрактный тип, его не следует использовать для объявления переменной, поскольку это плохо сказывается на производительности. В данном конкретном случае это может быть не важно, но лучше с самого начала выработать хорошие привычки. Вместо Array{Int} одного можно использовать

  • Array{Int, 1}([1, 2, 3, 4])
  • Vector{Int}([1, 2, 3, 4])
  • Int[1, 2, 3]
  • [1, 2, 3]

Последний вариант является законным, потому что Julia может самостоятельно определить тип контейнера в этом простом сценарии.