如何用Python Pandas统计议员赞成反对票数并关联议员信息
解决方案步骤
1. 统计每位议员的赞成/反对票数
先处理vote_results,按legislator_id分组后,用agg()方法分别统计赞成票(vote=1)和反对票(vote=2)的次数,同时给统计结果设置别名:
# 统计赞成和反对票 vote_counts = vote_results.groupby('legislator_id').agg( supported_bills=('vote', lambda x: (x == 1).sum()), opposed_bills=('vote', lambda x: (x == 2).sum()) ).reset_index()
关键说明:
groupby('legislator_id')返回的是GroupBy对象,不是直接的统计结果,所以你之前看不到数据——必须调用聚合函数(比如agg())才能生成结构化的DataFrame。agg()的参数是键值对:键就是你想要的列别名(比如supported_bills),值是聚合逻辑——用lambda表达式筛选出对应vote值的行,再通过sum()统计数量(布尔值True等价于1,False等价于0,求和就是计数)。reset_index()把分组用的legislator_id从索引变回普通列,方便后续和议员表关联。
2. 关联议员姓名
用merge()把统计结果和legislators表按legislator_id匹配,获取议员姓名:
# 关联议员姓名(假设legislators中的姓名列名为name) final_result = vote_counts.merge( legislators[['legislator_id', 'name']], # 只保留需要的列,减少冗余数据 on='legislator_id', how='left' # 保留所有有投票记录的议员,即使议员表中无对应数据 )
可选调整:
如果只需要两边都存在的议员数据,把how='left'改成how='inner'即可。
3. 查看最终结果
直接打印或调用head()查看数据:
print(final_result) # 或者查看前5行数据 print(final_result.head())
补充:更简洁的统计方式
如果只是简单计数,也可以用crosstab生成交叉表后重命名列:
import pandas as pd vote_counts = pd.crosstab( vote_results['legislator_id'], vote_results['vote'] ).rename(columns={1: 'supported_bills', 2: 'opposed_bills'}).reset_index()
内容的提问来源于stack exchange,提问作者Wellington Guedes
相关产品推荐
相关产品推荐

