如何在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的统计,可通过以下两步完成:
- 执行外连接并添加来源标识列
使用join方法时开启indicator=True,会自动生成_merge列,标记每行数据的来源:
merged_df = autosize.join( autoexpense, on="make", how="outer", indicator=True )
_merge列的取值对应三种情况:
both:该行数据在两张表中都存在(匹配成功)left_only:仅存在于主表autosizeright_only:仅存在于副表autoexpense
- 分组统计各类行数
对_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
相关产品推荐
相关产品推荐

