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

如何使用Pandas计算各选区的margin of share并生成新DataFrame

Pandas实现选区得票率差(Margin of Share)计算

直接用Pandas的分组、合并和向量化操作就能搞定,比嵌套循环高效得多,步骤如下:

1. 预处理:重命名列(可选但推荐)

原数据里的share in votes带空格,操作起来麻烦,先重命名:

df = df.rename(columns={'share in votes': 'share_in_votes'})

2. 提取关键数据子集

分别抽取出获胜党、每个选区的rank1和rank2政党的得票率数据:

# 提取所有获胜党数据
winner_df = df[df['Party'] == 'Winner'].copy()

# 提取每个(year, state, district)分组下rank=1的得票率
rank1_df = df[df['rank'] == 1].rename(columns={'share_in_votes': 'rank1_share'})[['year', 'state', 'district', 'rank1_share']]

# 提取每个分组下rank=2的得票率
rank2_df = df[df['rank'] == 2].rename(columns={'share_in_votes': 'rank2_share'})[['year', 'state', 'district', 'rank2_share']]

3. 合并数据

把获胜党数据和rank1、rank2的数据按选区维度合并,让每个选区的关键数据都在同一行:

# 先合并获胜党与rank1数据
merged_df = winner_df.merge(rank1_df, on=['year', 'state', 'district'])
# 再合并rank2数据(用left join兼容可能缺失rank2的极端情况)
merged_df = merged_df.merge(rank2_df, on=['year', 'state', 'district'], how='left')

4. 计算得票率差

根据规则用np.where实现条件计算:

import numpy as np

merged_df['margin_of_share'] = np.where(
    # 条件:获胜党rank为1
    merged_df['rank'] == 1,
    # 满足条件时:获胜党得票率 - rank2得票率
    merged_df['share_in_votes'] - merged_df['rank2_share'],
    # 不满足时:获胜党得票率 - rank1得票率
    merged_df['share_in_votes'] - merged_df['rank1_share']
)

5. 生成最终结果

只保留需要的字段:

final_df = merged_df[['year', 'state', 'district', 'margin_of_share']].copy()

补充说明

  • 全程用Pandas内置的向量化操作,比嵌套循环效率高几个数量级,尤其适合大数据量场景。
  • 如果存在某个选区没有rank2的情况,rank2_share会是NaN,此时计算结果也会是NaN,你可以根据需求用fillna(0)或者其他方式处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:05:16