dataframe - 使用 DataFramesMeta 包中的 @linq 整理 Julia 中的数据

标签 dataframe linq julia dataframesmeta.jl

我想使用 DataFramesMeta 包中的 @linq 宏来整理我的数据。

结果应该与下面的代码给出相同的结果:

using CSV, DataFrames, Dates

url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
download(url, joinpath(pwd(), "confirmed.csv"))

df = CSV.read(joinpath(pwd(), "confirmed.csv"))
rename!(df, 1 => :Province, 2 => :Country)
select!(df, Not([:Province, :Lat, :Long]))
df = combine(groupby(df, :Country), names(df)[2:end] .=> sum .=> names(df)[2:end])
df = stack(df, Not(:Country), :Country, variable_name=:Date, value_name=:Confirmed)
df[:Date] = parse.(Dates.Date, String.(df[:Date]), Dates.DateFormat("m/d/Y")) .+ Dates.Year(2000)

println(last(df, 10))

结果:

10×3 DataFrame
│ Row │ Country            │ Date       │ Confirmed │
│     │ String             │ Date       │ Int64     │
├─────┼────────────────────┼────────────┼───────────┤
│ 1   │ United Kingdom     │ 2020-10-29 │ 968456    │
│ 2   │ Uruguay            │ 2020-10-29 │ 3044      │
│ 3   │ Uzbekistan         │ 2020-10-29 │ 66392     │
│ 4   │ Venezuela          │ 2020-10-29 │ 91280     │
│ 5   │ Vietnam            │ 2020-10-29 │ 1177      │
│ 6   │ West Bank and Gaza │ 2020-10-29 │ 52571     │
│ 7   │ Western Sahara     │ 2020-10-29 │ 10        │
│ 8   │ Yemen              │ 2020-10-29 │ 2062      │
│ 9   │ Zambia             │ 2020-10-29 │ 16325     │
│ 10  │ Zimbabwe           │ 2020-10-29 │ 8349      │

到目前为止,我使用 @linq 的代码是:

using DataFramesMeta

df = @linq CSV.read(joinpath(pwd(), "data", "time_series_covid19_confirmed_global.csv")) |>
    rename(1 => :Province, 2 => :Country) |>
    select(vcat(names(df)[2], names(df)[5:end]))

但是,我陷入了对数据进行分组和汇总的阶段。 对于如何完成此 linq 查询有什么建议吗?

最佳答案

DataFramesMeta.jl 现在正在进行重大重构。也许 @pdeffebach 可以建议使用 master 上的功能来惯用它。

以下是我如何使用原始 DataFrames.jl 和 Pipe.jl 重写您的代码:

df = CSV.read(joinpath(pwd(), "confirmed.csv"), DataFrame)

@pipe df |>
      rename(_, 1 => :Province, 2 => :Country) |> # avoid ! to make sure we do not mutate the source
      select!(_, Not([:Province, :Lat, :Long])) |>
      groupby(_, :Country) |>
      combine(_, valuecols(_) .=> sum .=> valuecols(_)) |>
      stack(_, Not(:Country), :Country, variable_name=:Date, value_name=:Confirmed) |>
      transform!(_, :Date => ByRow(x -> parse(Date, string(x), DateFormat("m/d/Y")) + Year(2000)) => :Date) |>
      last(_, 10)

请注意,在您的代码中:

  • CSV.read(joinpath(pwd(), "confirmed.csv")) (将 DataFrame 添加为我的代码中的第二个参数)
  • df[:Date] 应为 df.Datedf."Date" (第二种样式是在名称包含例如空格)

已弃用。

关于dataframe - 使用 DataFramesMeta 包中的 @linq 整理 Julia 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64611236/

相关文章:

r - 仅获取 R 数据框中元素的值(不带索引)

c# - 在 C# 中使用 linq 合并列表

asp.net - 如何跨多个 ASP.NET 请求更新 EF 中的实体而无需再次检索它?

c# - 批量从SQL Server中获取数据

arrays - julia 选择数组/矩阵中除一个元素外的所有元素

r - 使用 tidyverse 到 "unnest"小标题内的 data.frame 列

r - 简单的data.frame reshape

julia - 数据帧的分层采样

loops - 如何在 julia 中使用数组元素作为迭代器?

python - 避免大型 Pandas DataFrame 上 GroupBy 的内存问题