使用pandas分析1976年至2010年的美国大选的投票数据

简介: 使用pandas分析1976年至2010年的美国大选的投票数据

我最近在Kaggle上看到了美国大选的数据集。既然我们正在热烈讨论2020年的大选,我想分析一下之前的美国总统大选是个好主意。

640.png

数据集包含了从1976年到2020年的选举。我会从不同的角度来处理这些数据,试图了解人们是如何投票的。

我将使用pandas库进行数据分析和可视化,因此这也是使用pandas的函数和方法的良好实践。

让我们从导入库并将数据集读入一个Pandas dataframe开始。

importnumpyasnpimportpandasaspdpresident=pd.read_csv("/content/president-1976-2016.csv")

640.png

在分析中有一些多余的列。例如state_fips、state_cen和state_ic代表什么可能不是很确定,但它们可以作为一个指示器或状态的唯一值。

我们可以通过检查和比较这些列中的值来确认。这三列有51个惟一值(每个州一个)。

president.state_fips.nunique()
51

对于特定的州,这些列中的值是相同的:

president[president.state=='Alabama'][['state_fips','state_cen','state_ic']].value_counts()state_fipsstate_censtate_ic1634163dtype: int64

由于数据集已经包含状态信息,所以这些列在分析方面是多余的,因此可以删除它们。

office列仅表示这是总统选举,因此它包含一个惟一的值(US President)。version和notes列也没有任何用处。

我们可以使用Pandas的drop函数来删除这些列。

president.drop(['state_po', 'state_fips', 'state_cen', 'state_ic',
'office', 'version', 'notes'], axis=1, inplace=True)

640.png

我们准备开始分析,我将分析分为三个部分:

  1. 一段时间内的总票数
  2. 每个获胜者的投票比例
  3. 国家层面的比较

一段时间内的总票数

我们首先要检查的是每次选举的票数。“totalvotes”列显示特定状态下的投票总数。因此,下面的代码将创建一个dataframe,其中包含每个州对于每次选举的总票数。

yearly_votes=president[['year','state','totalvotes']]\.groupby(['year','state']).mean().reset_index()
yearly_votes.head()

我们可以对“year”列应用groupby函数,并对“totalvotes”列中的值求和,从而得到每次选举的总票数。

yearly_votes.groupby('year').sum()\.plot(figsize=(10,6), legend=False,title='Total Number of Votes in US Presendial Elections')

640.png

我使用了pandas内置的绘图函数来绘制结果。它比使用Matplotlib的pyplot接口更简单,但是对plot的控制较少。

除了1996年和2012年,参加投票的人数一直在稳步增加。这很可能是由于人口增长,因此更好的衡量方法是每百万人口(有资格投票)的票数。粗略比较一下,从1970年(2.03亿)到2010年(3.08亿),人口增长了大约50%。因此,投票人数的比例多年来基本保持不变。

每个获胜者的投票比例

有些选举的结果非常接近,获胜者只以很小的百分比获胜。也有一些选举中获胜者以很大的优势获胜。

我们可以计算出每个获胜者的投票比例。我们将首先在dataframe中添加一个“winner”列。

维基百科页面包含了美国总统的名单。使用read_html函数可以很容易地将这些表读入到一个panda数据框架中。它将web页面中的表转换为数据列表。

dfs=pd.read_html("https://en.wikipedia.org/wiki/List_of_presidents_of_the_United_States")
winners=dfs[1][['Election','President.1']]
winners.head()

640.png

第二个数据列表包含了美国总统的名单。我们只需要1976年到2016年的选举数据。

winners=winners.iloc[-12:-1, :]
winners.Election=winners.Election.astype('int64')
winners.rename(columns={'President.1':'winner'}, inplace=True)
winners

640.png

我们需要将名称与总统dataframe中的名称进行格式的统一。pandas的字符串操作能够很好的来完成这个任务:

first_name=winners.winner.str.rsplit(' ', n=1, expand=True)[0]
last_name=winners.winner.str.rsplit(' ', n=1, expand=True)[1]
winners.winner=last_name+', '+first_namewinners

640.png

我们还需要做一些小调整,以便总统的名字完全匹配。

winners.winner[73] ='Bush, George H.W.'winners.winner[78] ='Obama, Barack H.'winners.winner[79] ='Obama, Barack H.'winners.winner[80] ='Trump, Donald J.'

我还将选举日期转换为整数,以便在下一个步骤中使用合并函数。

我们现在可以根据选举年合并“president”和“winners”数据。

president=pd.merge(president, winners, left_on='year', right_on='Election')

我们将过滤president dataframe,只包括对获胜者的投票。

winner_votes=president[president.candidate==president.winner]
winner_votes.head()

640.png

每行包含获胜者的票数和特定选举在特定州的总票数。一个简单的groupby函数将为我们提供各个国家的值。

total_votes=winner_votes[['year','winner','candidatevotes','totalvotes']]\.groupby(['year','winner']).sum()
total_votes

640.png

我们可以通过一个简单的数学运算来计算获胜者的比例,并对结果进行排序。

(total_votes.candidatevotes/total_votes.totalvotes)\.sort_values(ascending=False)

640.png

第一名是里根的第二任期。

国家层面比较

如果你喜欢政治,你就会知道每个州更可能支持哪个政党。我们用数字来验证一下。

640.png

这是winner_votes数据列表。我们将添加一个比率列,即候选人票数除以总票数。

winner_votes['ratio'] =winner_votes.candidatevotes/winner_votes.totalvotes

我们希望看到民主党和共和党都排在前十位的州。下面的groupby操作将返回基于民主党最高平均比率的前10个州。

winner_votes[winner_votes.party=='democrat'][['state','ratio']]\.groupby('state').mean().sort_values(by='ratio', ascending=False)[:10]

640.png

这是共和党方面同样操作的结果。

640.png

结论

我们已经分析了美国总统选举的投票数量,每个总统在投票方面的主导地位,以及各州对民主党和共和党的投票情况。但是这篇文章的重点是练习如何将pandas用于数据分析和操作。在数据分析和操作方面,我们做了大量的操作,这个才是我们这篇文章的目的。

最后感谢您的阅读。

目录
相关文章
|
7月前
|
Java 数据挖掘 数据处理
(Pandas)Python做数据处理必选框架之一!(一):介绍Pandas中的两个数据结构;刨析Series:如何访问数据;数据去重、取众数、总和、标准差、方差、平均值等;判断缺失值、获取索引...
Pandas 是一个开源的数据分析和数据处理库,它是基于 Python 编程语言的。 Pandas 提供了易于使用的数据结构和数据分析工具,特别适用于处理结构化数据,如表格型数据(类似于Excel表格)。 Pandas 是数据科学和分析领域中常用的工具之一,它使得用户能够轻松地从各种数据源中导入数据,并对数据进行高效的操作和分析。 Pandas 主要引入了两种新的数据结构:Series 和 DataFrame。
672 0
|
12月前
|
数据采集 安全 数据挖掘
Pandas数据合并:10种高效连接技巧与常见问题
在数据分析中,数据合并是常见且关键的步骤。本文针对合并来自多个来源的数据集时可能遇到的问题,如列丢失、重复记录等,提供系统解决方案。基于对超1000个复杂数据集的分析经验,总结了10种关键技术,涵盖Pandas库中`merge`和`join`函数的使用方法。内容包括基本合并、左连接、右连接、外连接、基于索引连接、多键合并、数据拼接、交叉连接、后缀管理和合并验证等场景。通过实际案例与技术原理解析,帮助用户高效准确地完成数据整合任务,提升数据分析效率。
1036 13
Pandas数据合并:10种高效连接技巧与常见问题
|
监控 物联网 数据处理
Pandas高级数据处理:数据流式计算
本文介绍了如何使用 Pandas 进行流式数据处理。流式计算能够实时处理不断流入的数据,适用于金融交易、物联网监控等场景。Pandas 虽然主要用于批处理,但通过分块读取文件、增量更新 DataFrame 和使用生成器等方式,也能实现简单的流式计算。文章还详细讨论了内存溢出、数据类型不一致、数据丢失或重复及性能瓶颈等常见问题的解决方案,并建议在处理大规模数据时使用专门的流式计算框架。
761 100
Pandas高级数据处理:数据流式计算
|
数据采集 数据可视化 数据处理
Pandas高级数据处理:数据仪表板制作
《Pandas高级数据处理:数据仪表板制作》涵盖数据清洗、聚合、时间序列处理等技巧,解决常见错误如KeyError和内存溢出。通过多源数据整合、动态数据透视及可视化准备,结合性能优化与最佳实践,助你构建响应快速、数据精准的商业级数据仪表板。适合希望提升数据分析能力的开发者。
369 31
|
消息中间件 数据挖掘 数据处理
Pandas高级数据处理:数据流式计算
在大数据时代,Pandas作为Python强大的数据分析库,在处理结构化数据方面表现出色。然而,面对海量数据时,如何实现高效的流式计算成为关键。本文探讨了Pandas在流式计算中的常见问题与挑战,如内存限制、性能瓶颈和数据一致性,并提供了详细的解决方案,包括使用`chunksize`分批读取、向量化操作及`dask`库等方法,帮助读者更好地应对大规模数据处理需求。
323 17
|
缓存 数据可视化 BI
Pandas高级数据处理:数据仪表板制作
在数据分析中,面对庞大、多维度的数据集(如销售记录、用户行为日志),直接查看原始数据难以快速抓住重点。传统展示方式(如Excel表格)缺乏交互性和动态性,影响决策效率。为此,我们利用Python的Pandas库构建数据仪表板,具备数据聚合筛选、可视化图表生成和性能优化功能,帮助业务人员直观分析不同品类商品销量分布、省份销售额排名及日均订单量变化趋势,提升数据洞察力与决策效率。
335 12
|
数据采集 存储 数据可视化
Pandas高级数据处理:数据报告生成
Pandas 是数据分析领域不可或缺的工具,支持多种文件格式的数据读取与写入、数据清洗、筛选与过滤。本文从基础到高级,介绍如何使用 Pandas 进行数据处理,并解决常见问题和报错,如数据类型不一致、时间格式解析错误、内存不足等。最后,通过数据汇总、可视化和报告导出,生成专业的数据报告,帮助你在实际工作中更加高效地处理数据。
422 8
|
数据采集 并行计算 数据可视化
Pandas高级数据处理:数据报告生成实战指南
数据报告生成面临数据质量、计算性能、呈现形式和自动化等核心挑战。常见问题包括缺失值导致统计失真、内存溢出及可视化困难。解决方案涵盖数据清洗、分块处理、安全绘图模板等。通过模块化设计、异常处理机制和性能优化策略,如使用`category`类型、并行计算等,可大幅提升效率。最佳实践建议建立数据质量检查清单、版本控制和自动化测试框架,确保系统具备自适应能力,提升报告生成效率300%以上。
376 12
|
数据采集 供应链 数据可视化
Pandas数据应用:供应链优化
在当今全球化的商业环境中,供应链管理日益复杂。Pandas作为Python的强大数据分析库,能有效处理库存、物流和生产计划中的大量数据。本文介绍如何用Pandas优化供应链,涵盖数据导入、清洗、类型转换、分析与可视化,并探讨常见问题及解决方案,帮助读者在供应链项目中更加得心应手。
320 21
|
机器学习/深度学习 搜索推荐 数据挖掘
Pandas数据应用:广告效果评估
在数字化营销中,广告效果评估至关重要。Pandas作为Python的强大数据分析库,在处理广告数据时表现出色。本文介绍如何使用Pandas进行广告效果评估,涵盖数据读取、预览、缺失值处理、数据类型转换及常见报错解决方法,并通过代码案例详细解释。掌握这些技能,可为深入分析广告效果打下坚实基础。
302 17

热门文章

最新文章