利用Python做数据分析中的异常处理

写在前面的:


本文用到的数据: http://www.evernote.com/l/AnzL68lV2tBPUKvrI7TmuERGir07Si-ZX9Q/
学习python和数据分析推荐地方: www.lynda.com  
获取lynda官网会员的方式: get_lynda_com()
----------------------------------------------------------------------------------------------------------------------------------------------
在这个任务中,我们将与 legislators.csv 美国国会每个历史成员记录信息。 这是数据集的预览:
last_name first_name 生日 性别 类型 状态 聚会
Bassett Richard 1745 - 0 4 - 0 2 M sen DE Anti - Administration
Bland Theodorick 1742 - 0 3 - 21 ,, rep VA
Burke Aedanus 1743 - 0 6 - 16 ,, rep SC
Carroll Daniel 1730 - 0 7 - 22 M rep MD
该文件包括以下列:
  • last_name - 立法者的姓氏
  • first_name - 立法者的名字
  • birthday - 立法者的生日
  • gender - 立法者的性别
  • type- 立法者服务的议会 - 参议院(sen)或众议院(rep
  • state - 立法者所代表的国家
  • party - 立法者党派隶属
从数据提取中可以看出,某些行包含某些列的缺失值。 例如, 标题行后面的第二行中缺少 gender party 列。 丢失的数据可能会导致错误,因此需要处理。 在这个任务中,我们将探讨当我们忽略缺失值和处理它们时发生的一些错误。
在我们学习的时候,我们将努力寻找美国立法者最常见的名字。 我们将为这个任务奠定基础,并把它们放在一起。

1. 集合(set)
在探索数据时,提取 列表中 的唯一元素通常很有用 例如,此列表具有重复值:
[ “犬” “猫” “河马” “狗” “猫” “狗” “狗” “猫” ]
提取独特元素将给我们:
[ “狗” “猫” “河马” ]
以这种方式 简化 列表 可以帮助您找到意外的值。
此转换的结果是一 数据类型,每个元素都是唯一的。 集合,  列表 非常相似 但是,如果集合添加元素时,假如已经包含该元素,则集合会忽略它。 此外,集合中的元素 是无序的,而列表中的每个项目都有一个 索引
您可以 使用 set() 函数 创建一个 集合 只需将 列表 传递 到函数中,该函数将转换为:
unique_animals = set( [ “犬” “猫” “河马” “狗” “猫” “狗” “狗” “猫” ])
print( unique_animals)
我们会得到 {'河马', '猫', '狗'} 结果。集合使用大括号{} 因为 集合 没有索引,所以每次打印时,集合中的项目可能会以不同的顺序显示。
您可以 使用 add() 方法 将项目添加到 集合中
unique_animals.add( “虎”)
最后,您可以 使用 remove() 方法 集合中 删除项目
unique_animals.remove( “狗”)
如果我们要将一个 集合 转换 成一个 列表 ,我们可以使用 list() 方法:
list( unique_animals)

2.数据的问题
当您有一个新的数据集时,寻找任何模式总是一个好主意,如:
  • 数据缺失
    • 某些文件包含空字段。其他人可能会使用字符串N/A来表示缺少值。
  • 直觉一看就不对的数据
    • 比如一个立法者的birthday2050年,与常理不符合。
  • 重复数据
    • 这个数据集中的一个数据是绝大多数立法者是男性。

3.如何处理数据缺失
您可以使用以下策略之一来解决丢失的数据:
  • 删除包含缺少数据的任何行。
  • 用指定的值填充空字段。
  • 用计算的值填充空字段。
  • 使用与缺少数据一起使用的分析技术。
稍后我们将会更深入地处理缺少的数据,但是现在我们将专注于使用指定的值填充空字段。
下面是我们如何能在替换任何缺失值 party 与列 字符串   No Party
rows = [
[ “Basset” “Richard” “1745年4月2日” “M” , “Sun “DE” , “Anti-administration ],
[ “Bland” “Theodorick” “1742-03-21” “” “rep” “VA” “” ]
]
for row in rows
if row [ 6 ] == “”
row [ 6 ] = “No Party”
一步一步,我们:
  • 循环遍历每行rows
  • 检查party列(索引6)是否缺少值。
  • 如果是这样,请用字符串 No Party替换它。
接下来,我们将填充 gender 列中 的空字段 大多数美国立法者在历史上是男人(虽然这是变化的),所以我们将用 字符串   替换任何缺失的值 M

4.获取某列中的年
虽然我们正在寻找美国立法者最常见的名字,但出生年份也可能令人感兴趣。 例如,我们可以使用该字段来识别历史命名趋势,并探索受欢迎的名称从 1820 今天变化。
您可能已经注意到,该 birthday 列具有 1820-01-02 难以处理 的格式 然而,重新格式化值来简化它们是很常见的。 在这种情况下,我们可以将日期分成其组成部分:
date = "1820-01-02"
parts = date . split ( "-" )
print ( parts )

这将创建一个列表 ["1820", "01", "02"] 名单上的第一项是立法委员出生的一年,第二个是该月,最后一个是当天。

5.try/except代码块处理数据缺失
将列转换为不同的数据类型是数据分析中的常见操作。 例如,我们刚刚提取了 year 上一个屏幕,但是它是 字符串 形式。 要找到立法者出生的平均年份,我们需要首先将数据转换为 整数 我们可以使用 int() 函数 来执行这个转换 唯一的挑战是 year 列缺少值。 如果我们尝试转换一个缺失的值,我们会收到一个错误:
int ( '' )
上面的代码将导致一个 ValueError ,因为空 字符串 不能转换为 整数
不是所有的错误都应该停止执行。 有时候,我们期待某种类型的错误,并希望以允许代码完成的特定方式处理它。 我们可以用被称为 try / except块的 东西来管理错误 如果您围绕导致 try / except块 错误的代码,将会处理该错误,代码将继续运行:
try :
int ( '' )
except Exception :
print ( "There was an error" )
在上面的例子中,Python解释器将尝试运行 int('') 并生成一个 ValueError 而不是停止代码执行,它将由 except 语句 处理 ,这将打印消息 There was an error Python解释器将继续运行 except 语句 后面的任何代码行


6.捕获异常并提示信息
当Python解释器生成 异常时 ,它实际上创建了一个 Exception 的实例 这个类有一些属性帮助我们调试错误。 我们可以 Exception except 语句体中 访问 的实例
try :
int ( '' )
except Exception as exc :
print ( type ( exc ))
在上面的例子中,我们使用该 as 语句将 Exception 的实例分配给 变量 exc 然后,我们可以访问 except 语句体中 的变量 打印 type(exc) 将显示 Exception try 语句正文 中发生 的类型
我们还可以将 Exception 转换 字符串 并打印出错误消息:
try :
int ( '' )
except Exception as exc :
print ( str ( exc ))
这将打印一个消息,帮助我们调试错误。

7.Pass语句
我们每次发生错误时都打印了一条消息:
try :
int ( '' )
except Exception :
print ( "There was an error" )
但是,有时我们不想做任何具体处理错误的事情;   我们只想让代码继续运行。 在循环播放长 列表 并多次执行相同操作 时,这是常见的 在这种情况下,打印许多错误消息将是相当烦人的。 例如,运行以下代码会导致许多错误:
numbers = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
for i in numbers :
try :
int ( '' )
except Exception :
print ( "There was an error" )
不幸的是,我们不能只是省略print语句来避免这种情况,因为这会导致错误:
numbers = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ]
for i in numbers :
try :
int ( '' )
except Exception :
这是因为以冒号( : 结尾的任何Python语句 需要在其下方有一个缩进的主体。 相反,我们可以使用 pass 关键字避免生成错误:
try :
int ( '' )
except Exception :
pass
虽然 pass 关键字实际上没有做任何事情,但它是一个有效的声明体。 它提供了一个解决方案,当我们不想要一个错误停止代码执行,但也不想在 except 语句正文中 做任何事情

8.转换数据类型
我们将所有的出生年份转换 legislators 整数 要更改 列表列表中 的项目 ,我们需要循环使用顶级列表( items ):
items = [
[ 1 , "1" , 2 ],
[ 2 , "" , 3 ],
[ 5 , "5" , 3 ]
]
for item in items :
item [ 1 ] = int ( item [ 1 ])
上述代码将修改每个 item (嵌入式 列表 )中 的第二个元素 换句话说,它会将第二列中的所有值转换 items 整数

我们已经将出生年龄解析为 整数 ,但现在我们有几个出生年份的价值 0 下面是在最初的几个项目 birth_year 的列 legislators
[ 1745 ,
1742 ,
1743 ,
1730 ,
1739 ,
0 ,
1738 ,
1745 ,
1748 ,
...
]
在探索数据集时,您可能已经注意到立法者按照时间顺序排列。 我们可以使用这些知识来智能地填充缺失的值。
此前,我们用固定值替换了缺失值 M 这一次,因为这些值通常按时间顺序显示,我们可以循环遍历每一年,并用 0 以前的行中的值 替换任何 值。
通过这样做,我们将确保没有出生年份的每个立法者被分配一个比实际日期相对较近的立法者。


更多学习Python和数据分析,机器学习资料和交流,请加群:
群名称: PYTHONERS-数据
群   号: 663468799

























你可能感兴趣的:(Python学习,数据分析)