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

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

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

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

import numpy as np
import pandas as pdpresident = pd.read_csv("/content/president-1976-2016.csv")

在分析中有一些多余的列。例如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_fips  state_cen  state_ic
1           63         41          63
dtype: 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)

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

  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')

我使用了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()

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

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

我们需要将名称与总统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

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

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()

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

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

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

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

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

国家层面比较

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

这是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]

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

结论

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

最后感谢您的阅读。

作者:Soner Yıldırım

deephub翻译组

使用pandas分析1976年至2010年的美国大选相关推荐

  1. 用pandas分析百万电影数据

    用pandas分析电影数据 Lift is short, use Python. 用Python做数据分析,pandas是Python数据分析的重要包,其他重要的包:numpy.matplotlib ...

  2. 使用 Pandas 分析 Apache 日志

    本文的作者是 Nikolay Koldunov,本文原文是 Apache log analysis with Pandas 注本文的图有问题,没法引用,还是去原文看下,这里作为一个引子. %pylab ...

  3. python读取大数据量xml_多快好省地使用pandas分析大型数据集

    1 简介 pandas虽然是个非常流行的数据分析利器,但很多朋友在使用pandas处理较大规模的数据集的时候经常会反映pandas运算"慢",且内存开销"大". ...

  4. 文末送书|用Pandas分析了75w多条数据,揭秘美国选民的总统喜好!

    点击"一行数据",选择"置顶公众号" 文末送书,不可错过! 来源:天池大数据科研平台 原文:https://tianchi.aliyun.com/noteboo ...

  5. 用Pandas分析了75w多条数据,揭秘美国选民的总统喜好!

    来源:天池大数据科研平台 原文:https://tianchi.aliyun.com/notebook-ai/detail?&postId=137714 大家好,我是小z- 今天和大家分享的内 ...

  6. 用Pandas分析了75w多条数据,揭秘美国选民的总统喜好

    来源:天池大数据科研平台 原文:https://tianchi.aliyun.com/notebook-ai/detail?&postId=137714 1.实战前准备 1.1 前言 本文通过 ...

  7. 用Numpy和Pandas分析二维数据笔记

    用Numpy和Pandas分析二维数据 上节课,我们利用numpy和pandas分析了一维数据.在这节课中,你将学到这两种库的更多特性.并用它们来分析 二维数据,这节课后,你将能够使用pandas重新 ...

  8. Pandas 分析斐波那契数列模整数的周期问题

    Pandas 分析斐波那契数列模整数的周期问题 引言 一.改进 Pisano 周期计算 二.计算 Pisano 周期的循环节 三.快速计算任意斐波那契数模 m m m 的余数 四.计算模 100 万以 ...

  9. 3 Python数据分析 美国各州人口分析案例 Pandas高级操作 美国大选献金案例 matplotlib

    Python数据分析 1 案例 美国各州人口分析 1.1 数据介绍 数据来源:https://github.com/jakevdp/data-USstates/ 1.1.1 州人口数量表 state- ...

最新文章

  1. BPM与Portal SSO实施方案v2
  2. 实用手册:11种常见滤镜及使用效果
  3. 个人信息泄露,背后竟有“内鬼”作祟,堵上网络安全漏洞
  4. 如何在tensorflow2环境运行tensorflow1代码
  5. C语言已排序链表插入新节点保持排序状态(附完整源码)
  6. c语言百文百鸡问题答案,python_百文买百鸡问题
  7. 黑客必须了解的网络知识
  8. [Node.js] ES6新语法
  9. 【java基础知识】修改字符串的编码格式
  10. BZOJ 3282 Link Cut Tree (LCT)
  11. fetch 函数分装
  12. leetcode python3 简单题202. Happy Number
  13. linux从前往后读取文件夹图片名称,Linux目录和文件中的常用命令(三)
  14. 图像局部特征(九)--斑点检测LOG算子
  15. LeetCode 654. Maximum Binary Tree最大二叉树 (C++)
  16. BAT监视360进程.txt
  17. 保密工作中非密计算机工具检查,【保密知识】别在保密工作面前耍“小聪明”哦~...
  18. java解析shp文件
  19. 索泰显卡超频软件测试要多少时间,索泰显卡超频软件(FireStorm)
  20. 大四学年个人自我鉴定

热门文章

  1. 【工控老马】西门子PLC Siemens PLC TCP协议详解
  2. 嵌入式linux编码器,基于嵌入式平台的视频编码器的实现-嵌入式系统-与非网
  3. 英语单词复习1(四级)
  4. oracle分组查询取第一条数据,160804、oracle查询:取出每组中的第一条记录
  5. 【Book 133】Illuminate-Harness the Positive Power of negative Thinking
  6. 文件操作opendir()/readdir()/closedir()/stat()
  7. NEC3 L2 Thirteen equals one
  8. 史上最全的Uboot常用命令汇总(超全面!超详细!)收藏这一篇就够了
  9. 基因去重表达矩阵有重复的基因名 探针名字
  10. 苹果开发者帐号关联大批量下架如何规避?