#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 │
├─────┼───────┼─────────┼───────┼─────────┤
│ 1 │ 1 │ 4.5 │ 9 │ 13.5 │
│ 2 │ 2 │ 6.0 │ 6 │ 12.0 │
│ 3 │ 3 │ 8.0 │ 8 │ 16.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 │
├─────┼───────┼─────────┼───────┼─────────┤
│ 1 │ 1 │ 4.5 │ 9 │ 13.5 │
│ 2 │ 2 │ 6.0 │ 6 │ 12.0 │
│ 3 │ 3 │ 8.0 │ 8 │ 16.0 │