You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars中实现类似Stata Join的匹配/未匹配行数统计?

在Polars中实现类似Stata合并时的匹配行数统计

Stata的合并反馈机制

当连接两个数据表时,Stata会自动打印出合并后各类匹配情况的行数统计。例如执行以下代码:

use https://www.stata-press.com/data/r19/autosize
merge 1:1 make using https://www.stata-press.com/data/r19/autoexpense

执行后会输出统计表格,清晰展示匹配成功的行数、仅存在于主表的行数、仅存在于副表的行数。

Polars中的实现步骤

先给出示例所用的初始数据定义:

import polars as pl

autoexpense = pl.DataFrame(
    [
        pl.Series('make', ['Toyota Celica', 'BMW 320i', 'Cad. Seville', 'Pont. Grand Prix', 'Datsun 210'], dtype=pl.String),
        pl.Series('price', [5899, 9735, 15906, 5222, 4589], dtype=pl.Int64),
        pl.Series('mpg', [18, 25, 21, 19, 35], dtype=pl.Int64),
    ]
)

autosize = pl.DataFrame(
    [
        pl.Series('make', ['Toyota Celica', 'BMW 320i', 'Cad. Seville', 'Pont. Grand Prix', 'Datsun 210', 'Plym. Arrow'], dtype=pl.String),
        pl.Series('weight', [2410, 2650, 4290, 3210, 2020, 3260], dtype=pl.Int64),
        pl.Series('length', [174, 177, 204, 201, 165, 170], dtype=pl.Int64),
    ]
)

要实现类似Stata的统计,可通过以下两步完成:

  1. 执行外连接并添加来源标识列
    使用join方法时开启indicator=True,会自动生成_merge列,标记每行数据的来源:
merged_df = autosize.join(
    autoexpense,
    on="make",
    how="outer",
    indicator=True
)

_merge列的取值对应三种情况:

  • both:该行数据在两张表中都存在(匹配成功)
  • left_only:仅存在于主表autosize
  • right_only:仅存在于副表autoexpense
  1. 分组统计各类行数
    对_merge列分组计数,即可得到与Stata一致的统计结果:
merge_stats = merged_df.group_by("_merge").agg(pl.count().alias("行数"))
print(merge_stats)

执行后输出结果示例:

shape: (3, 2)
┌────────────┬──────┐
│ _merge     │ 行数 │
│ ---        │ ---  │
│ str        │ u32  │
├────────────┼──────┤
│ both       │ 5    │
│ left_only  │ 1    │
│ right_only │ 0    │
└────────────┴──────┘

补充:pandas的实现方式

pandas的merge方法自带indicator参数,开启后会在合并结果中添加来源标识列,后续同样可通过分组统计得到匹配行数汇总。

内容的提问来源于stack exchange,提问作者robertspierre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 01:40:22