如何在Python Polars中创建类似Pandas的嵌套表格
在Polars中实现多级嵌套表格(支持行/列三级嵌套)
Polars确实没有Pandas式的多级索引,但可以通过**结构化列(Struct Columns)**结合分组、透视操作,实现完全等效的行/列多级嵌套表格效果,包括三级嵌套。以下是针对房贷审批数据集的具体实现方案:
核心思路
用Polars的struct类型模拟多级索引的层级关系:
- 行嵌套:将多个分组字段打包成一个struct列,作为行的层级标识
- 列嵌套:透视时指定多个字段作为列维度,Polars会自动将这些维度组合成tuple形式的列名,或手动打包成struct列来明确层级
代码示例
假设已加载数据集为pl.DataFrame对象:
import polars as pl # 加载本地数据集 df = pl.read_csv("home_loan_approval.csv")
1. 行两级嵌套表格
实现Gender→Married的行层级,聚合贷款金额的均值与总和:
row_two_level = df.group_by(["Gender", "Married"]).agg( pl.mean("LoanAmount").alias("平均贷款额"), pl.sum("LoanAmount").alias("总贷款额") ).with_columns( # 打包行层级字段为struct,模拟多级索引 pl.struct(["Gender", "Married"]).alias("行层级") ).drop(["Gender", "Married"]).select(["行层级", "平均贷款额", "总贷款额"]) # 查看结果 print(row_two_level)
2. 列两级嵌套表格
实现Loan_Status→Property_Area的列层级,聚合申请人收入均值:
col_two_level = df.group_by(["Gender", "Loan_Status", "Property_Area"]).agg( pl.mean("ApplicantIncome").alias("平均收入") ).pivot( index="Gender", columns=["Loan_Status", "Property_Area"], values="平均收入" ) # 列名会以tuple形式呈现(如("Y", "Urban")),模拟嵌套层级;也可手动打包为struct列 col_two_level = col_two_level.rename( {col: pl.struct({"贷款状态": col[0], "房产区域": col[1]}).alias("列层级") for col in col_two_level.columns if col != "Gender"} )
3. 行+列三级嵌套表格
实现行层级Gender→Married→Dependents,列层级Loan_Status→Property_Area→Credit_History,聚合贷款额均值与申请计数:
triple_nested = df.group_by( ["Gender", "Married", "Dependents", "Loan_Status", "Property_Area", "Credit_History"] ).agg( pl.mean("LoanAmount").alias("平均贷款额"), pl.count().alias("申请数量") ).pivot( index=["Gender", "Married", "Dependents"], columns=["Loan_Status", "Property_Area", "Credit_History"], values=["平均贷款额", "申请数量"] ).with_columns( # 打包行三级层级为struct pl.struct(["Gender", "Married", "Dependents"]).alias("行三级层级") ).drop(["Gender", "Married", "Dependents"]) # 列名会以tuple形式呈现完整三级层级(如("Y", "Urban", 1.0, "平均贷款额"))
展开嵌套层级
如果需要将嵌套的struct或tuple层级展开,使用unnest方法即可:
# 展开行层级的struct row_two_level.unnest("行层级") # 展开列的tuple层级(若列是struct类型,直接对列字段调用unnest) col_two_level.unnest("列层级")
总结
Polars通过结构化列+多维度透视的组合,完全可以实现与Pandas多级索引表格等效的嵌套效果,支持任意层级的行/列嵌套,同时保留了Polars处理大型数据集的性能优势。
内容的提问来源于stack exchange,提问作者Suresh Nimbalkar
相关产品推荐
相关产品推荐

