如何使用Pandas将选举数据集重塑为选民与得票同列的单行宽表
宽表转换实现方案
你可以按以下步骤实现需求,首先修正原始数据中的拼写错误,再通过透视表完成行转列:
1. 预处理修正无效值
你提供的样例数据里tipo_de_voto字段存在拼写错误,先统一修正,也可以将空的党派标识替换为更易识别的名称:
import pandas as pd # 修正投票类型拼写错误 electores['tipo_de_voto'] = electores['tipo_de_voto'].replace({ 'negarivo': 'negativo', 'negartivo': 'negativo' }) # 可选:将空的党派名称替换为otros,方便后续列名识别 electores['agrup'] = electores['agrup'].replace('', 'otros')
2. 生成宽表
用pivot_table透视表功能,按站点、票台、选民数作为固定行维度,将职位、党派、投票类型转为列,对得票数做聚合:
wide_result = pd.pivot_table( electores, # 行维度:每个票台对应唯一的站点、票台编号、选民数 index=['estable', 'mesa', 'electores'], # 要展开为列的分类维度 columns=['cargo', 'agrup', 'tipo_de_voto'], # 值字段:得票数 values='cantidad', # 聚合规则:同分类得票数求和 aggfunc='sum', # 无数据的项补0 fill_value=0 ).reset_index() # 将多层列名合并为单层,用下划线连接,方便后续使用 wide_result.columns = [ '_'.join(col).strip('_') if isinstance(col, tuple) else col for col in wide_result.columns ]
输出效果说明
最终得到的wide_result每行对应单个票台的全量数据,列结构为:
- 基础维度列:
estable、mesa、electores - 得票统计列:如
concejal_fdt_positivo(议员席位FDT党派正票)、concejal_otros_negativo(议员席位其他党派废票)、diputado_jxc_positivo(众议员席位JXC党派正票)等所有分类的得票数据
内容的提问来源于stack exchange,提问作者Facundo Javier Vargas
相关产品推荐
相关产品推荐

