Query.jl — создайте новый столбец и используйте его немедленно

#dataframe #julia

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

Вопрос:

У меня есть DataFrame и я хочу вычислить кучу сводной статистики на уровне группы. Некоторые из этих статистических данных получены из других статистических данных, которые я хочу вычислить в первую очередь.

 df = DataFrame(a=[1,1,2,3], b=[4,5,6,8])

df2 = df |>
    @groupby(_.a) |>
    @map({a = key(_), 
          bm = mean(_.b), 
          cs = sum(_.b), 
          d = _.bm   _.cs}) |>
    DataFrame

ERROR: type NamedTuple has no field bm
  

Самое близкое, что я могу получить, это это, которое работает, но становится очень повторяющимся по мере роста количества исходных статистических данных, которые я хочу перенести в вычисление производных статистических данных:

 df2 = df |>
    @groupby(_.a) |>
    @map({a=key(_), bm=mean(_.b), cs=sum(_.b)}) |>
    @map({a=_.a, bm=_.bm, cs=_.cs, d=_.bm   _.cs}) |>
    DataFrame

3×4 DataFrame
│ Row │ a     │ bm      │ cs    │ d       │
│     │ Int64 │ Float64 │ Int64 │ Float64 │
├─────┼───────┼─────────┼───────┼─────────┤
│ 114.5913.5    │
│ 226.0612.0    │
│ 338.0816.0 

Другой вариант — создать новый DataFrame результатов первого порядка, запустить новый @map для этого, чтобы вычислить результаты второго порядка, а затем объединить их позже. Есть ли какой-либо способ Query , DataFramesMeta или даже просто DataFrames сделать это за один относительно краткий шаг?

Ответ №1:

Просто для справки, подход «создать несколько фреймов данных»:

 df = DataFrame(a=[1,1,2,3], b=[4,5,6,8])

df2 = df |>
    @groupby(_.a) |>
    @map({a=key(_), bm=mean(_.b), cs=sum(_.b)}) |>
    DataFrame

df3 = df2 |>
    @map({a=_.a, d=_.bm   _.cs}) |>
    DataFrame

df4 = innerjoin(df2, df3, on = :a)
  
 3×4 DataFrame
│ Row │ a     │ bm      │ cs    │ d       │
│     │ Int64 │ Float64 │ Int64 │ Float64 │
├─────┼───────┼─────────┼───────┼─────────┤
│ 114.5913.5    │
│ 226.0612.0    │
│ 338.0816.0