从 Pandas 到 Polars 三十:将具有不同架构的数据进行合并

你的项目中有一堆数据文件,它们都遵循一致的数据模式。

你得到了一个新文件,并发现从现在开始将会有一些有用的额外列。你打算如何将这个文件与旧数据合并起来呢?

在数据处理中,合并数据集是一项常见任务。通常,合并可以分为水平合并(如 pandas 中的 mergejoin)和垂直合并(如 pandas 中的 concat)。然而,在某些情况下,我们需要以一种特殊的方式合并数据,即“对角合并”或“对角拼接”,这种合并方式在 Polars 数据分析库中被称为 “diagonal concatenation”。

在上面的例子中,垂直合并(vertical concatenation)不适用,因为它不喜欢模式变化。

这时就是Polars中的对角合并(diagonal concatenation)发挥作用的时候了。

对角合并可以用 polars.concat 函数完成,但需要指定一个参数 how="diagonal"

例子如下:

# 旧模式包含年份、出口商和进口商三个字段。
dfTrades2020 = pl.DataFrame(
    [
        {"year":2020,"exporter":"China","importer":"USA"},
        {"year":2020,"exporter":"China","importer":"USA"},
    ]
)
shape: (2, 3)
┌──────┬──────────┬──────────┐
│ year ┆ exporter ┆ importer │
│ ---  ┆ ---      ┆ ---      │
│ i64  ┆ str      ┆ str      │
╞══════╪══════════╪══════════╡
│ 2020 ┆ China    ┆ USA      │
│ 2020 ┆ China    ┆ USA      │
└──────┴──────────┴──────────┘


# 新模式包含价值
dfTrades2021 = pl.DataFrame(
    [
        {"year":2021,"exporter":"China","importer":"USA","value":10},
        {"year":2021,"exporter":"China","importer":"USA","value":100},
    ]
)
shape: (2, 4)
┌──────┬──────────┬──────────┬───────┐
│ year ┆ exporter ┆ importer ┆ value │
│ ---  ┆ ---      ┆ ---      ┆ ---   │
│ i64  ┆ str      ┆ str      ┆ i64   │
╞══════╪══════════╪══════════╪═══════╡
│ 2021 ┆ China    ┆ USA      ┆ 10    │
│ 2021 ┆ China    ┆ USA      ┆ 100   │
└──────┴──────────┴──────────┴───────┘


# 对角合并
pl.concat([dfTrades2020,dfTrades2021],how="diagonal")

对角合并会将你的新记录及其新列追加到旧记录之后,并在旧记录的新列中添加空值(null),以表示数据缺失。这是有序的。

shape: (4, 4)
┌──────┬──────────┬──────────┬───────┐
│ year ┆ exporter ┆ importer ┆ value │
│ ---  ┆ ---      ┆ ---      ┆ ---   │
│ i64  ┆ str      ┆ str      ┆ i64   │
╞══════╪══════════╪══════════╪═══════╡
│ 2020 ┆ China    ┆ USA      ┆ null  │
│ 2020 ┆ China    ┆ USA      ┆ null  │
│ 2021 ┆ China    ┆ USA      ┆ 10    │
│ 2021 ┆ China    ┆ USA      ┆ 100   │
└──────┴──────────┴──────────┴───────┘

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值