ZetCode

Julia DataFrames

最后修改于 2025年3月8日

Julia 的 DataFrames 包是一个强大的结构化数据处理工具,类似于 Python 中的 pandas 或 R 中的 data frames。本教程将通过实际的真实世界示例,深入探讨基本和高级数据处理技术。

使用 DataFrames,您可以清理混乱的数据集,转换数据以供分析,并执行连接和聚合等复杂操作。它是 Julia 数据科学的基石。

安装 DataFrames

让我们开始在 Julia 中安装 DataFrames 包。

install.jl
using Pkg
Pkg.add("DataFrames")

using Pkg 行加载 Julia 的包管理器。然后,Pkg.add("DataFrames") 从 Julia 的包注册表中获取并安装 DataFrames 包。在 Julia REPL 或脚本中运行此代码。

创建 DataFrame

下面是如何创建一个代表员工记录的 DataFrame。

create.jl
using DataFrames
df = DataFrame(
    EmployeeID = [101, 102, 103],
    Name = ["Alice Smith", "Bob Jones", "Clara Lee"],
    Department = ["Sales", "IT", "HR"],
    Salary = [55000.0, 72000.0, 48000.0]
)
println(df)

这会创建一个包含四列的 DataFrame:EmployeeIDNameDepartmentSalary。每一列都是一个值的数组。println(df) 行会在控制台中显示表格,显示格式整齐的输出。

这个例子模拟了一个小型公司数据集,使其与业务数据分析任务相关。

从 CSV 加载数据

加载真实世界数据通常涉及读取 CSV 文件。这是一个例子。

load_csv.jl
using CSV, DataFrames
df = CSV.read("sales_data.csv", DataFrame)
println(first(df, 5))

首先,包含 CSVDataFramesCSV.read 函数将 "sales_data.csv" 加载到 DataFrame 中。假设 "sales_data.csv" 包含 OrderIDProductQuantityPrice 等列。

println(first(df, 5)) 显示前 5 行,这对于快速检查大型数据集很有用。这是数据分析工作流程中的一项常见任务。

过滤行

过滤是提取相关数据的关键。下面是一个包含销售数据的示例。

filter.jl
using DataFrames
df = DataFrame(
    OrderID = [1, 2, 3],
    Product = ["Laptop", "Mouse", "Monitor"],
    Quantity = [5, 20, 3],
    Price = [1200.0, 25.0, 300.0]
)
high_value = filter(row -> row.Price * row.Quantity > 1000, df)
println(high_value)

这会创建一个示例销售 DataFrame。filter 函数选择总值(Price * Quantity)超过 1000 的行。Lambda 函数 row -> row.Price * row.Quantity > 1000 评估每一行。

结果 high_value 可能包括“Laptop”和“Monitor”订单,有助于在业务环境中识别高价值交易。

排序 DataFrame

排序有助于组织数据。下面是如何按薪资对员工进行排序。

sort.jl
using DataFrames
df = DataFrame(
    Name = ["Alice", "Bob", "Clara"],
    Salary = [55000, 72000, 48000]
)
sorted_df = sort(df, :Salary, rev=true)
println(sorted_df)

sort 函数按 Salary 对 DataFrame 进行排序。rev=true 参数按降序排序,因此 Bob(72000)排在第一位,然后是 Alice 和 Clara。

这对于按薪酬对员工进行排名或在预算分析中优先处理高成本项目非常有用。

添加新列

添加列可以增强数据。在这里,我们计算年终奖金。

add_column.jl
using DataFrames
df = DataFrame(
    Name = ["Alice", "Bob"],
    Salary = [55000.0, 72000.0]
)
df[!, :Bonus] = df.Salary .* 0.1
println(df)

df[!, :Bonus] 语法添加了一个 Bonus 列。我们使用逐元素乘法运算符 .* 将其计算为 Salary 的 10%。Alice 获得 5500,Bob 获得 7200。

! 表示该操作会就地修改 df,这对于大型数据集来说效率很高。

分组和聚合

分组可以总结数据。这是按产品类别进行销售的示例。

group.jl
using DataFrames, Statistics
df = DataFrame(
    Category = ["Electronics", "Electronics", "Office"],
    Sales = [1200.0, 300.0, 50.0]
)
grouped = combine(groupby(df, :Category), :Sales => mean => :AvgSales)
println(grouped)

groupby 函数按 Category 对行进行分组。然后 combine 计算每个组的 Sales 平均值,并将其重命名为 AvgSales。电子产品的平均值为 750,办公用品为 50。

这对于在零售数据集中汇总产品线的销售业绩非常实用。

连接 DataFrame

连接可以组合数据集。在这里,我们合并员工和部门数据。

join.jl
using DataFrames
employees = DataFrame(
    ID = [101, 102],
    Name = ["Alice", "Bob"]
)
depts = DataFrame(
    ID = [101, 102],
    Dept = ["Sales", "IT"]
)
joined = innerjoin(employees, depts, on=:ID)
println(joined)

我们创建了两个 DataFrame:employees(包含姓名和 ID)和 depts(包含部门信息)。innerjoinID 上合并它们,只保留匹配的行。

结果将 Alice 与 Sales 匹配,将 Bob 与 IT 匹配,模拟了真实的 HR 系统查找。

处理缺失数据

真实数据通常有空白。这里是如何处理缺失值。

missing.jl
using DataFrames
df = DataFrame(
    Name = ["Alice", "Bob", "Clara"],
    Score = [85, missing, 90]
)
cleaned = dropmissing(df)
println(cleaned)

DataFrame 的 Score 列有一个 missing 值。dropmissing 删除任何包含缺失数据的行,因此 Bob 的行被排除,只剩下 Alice 和 Clara。

这对于准备无法处理缺失值的统计模型的数据至关重要。

将数据导出到 CSV

保存结果是很常见的。这里是如何将 DataFrame 导出到 CSV。

export.jl
using CSV, DataFrames
df = DataFrame(
    Product = ["Laptop", "Mouse"],
    Price = [1200.0, 25.0]
)
CSV.write("output.csv", df)

CSV.write 将 DataFrame 保存到 "output.csv"。该文件可以在 Excel 中打开或与同事共享,这是数据工作流程中的实用步骤。

DataFrames 的最佳实践

来源

Julia DataFrames 文档

本教程涵盖了 DataFrames 的实际用途,从创建和过滤数据到分组和导出,所有这些都通过真实的示例。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Julia 教程