Python-Polars:按列分组后将剩余列合并为结构体字段
解决Polars分组后生成字典结构体列的方案
示例数据构造
先模拟你的DataFrame结构:
import polars as pl df = pl.DataFrame({ "Census_Tract": ["Tract001", "Tract001", "Tract002", "Tract002"], "GEOID_Census": ["GEO1001", "GEO1001", "GEO1002", "GEO1002"], "table_B24012": ["B24012_001", "B24012_002", "B24012_001", "B24012_003"], "value": [150, 230, 180, 310] })
可行实现代码
使用Polars内置的结构体和列表方法,避免Python lambda带来的性能损耗:
result = ( df.group_by(["Census_Tract", "GEOID_Census"]) .agg( # 先将每组的table_B24012和value打包为结构体列表 pl.struct( key=pl.col("table_B24012"), value=pl.col("value") ).alias("temp_struct_list") ) .with_columns( # 将结构体列表转换为字典列 pl.col("temp_struct_list").list.to_dict( key_name="key", value_name="value" ).alias("table_value_dict") ) .drop("temp_struct_list") # 删除临时列 ) print(result)
结果说明
运行后每个GEOID_Census对应一行,table_value_dict列存储的是table_B24012与value映射的字典,示例输出:
shape: (2, 3) ┌───────────────┬────────────────┬───────────────────────────────────┐ │ Census_Tract ┆ GEOID_Census ┆ table_value_dict │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ object │ ╞═══════════════╪════════════════╪═══════════════════════════════════╡ │ Tract001 ┆ GEO1001 ┆ {"B24012_001":150, "B24012_002":230} │ │ Tract002 ┆ GEO1002 ┆ {"B24012_001":180, "B24012_003":310} │ └───────────────┴────────────────┴───────────────────────────────────┘
替代方案(适合小数据量)
如果你的数据集不大,也可以用map_elements直接生成字典:
result = df.group_by(["Census_Tract", "GEOID_Census"]).agg( pl.map_elements( lambda group: dict(zip(group["table_B24012"], group["value"])), return_dtype=pl.Object ).alias("table_value_dict") )
内容的提问来源于stack exchange,提问作者ikebeau
相关产品推荐
相关产品推荐

