1.缺失值处理
从data.info()可以明显看出contbr_employer、contbr_occupation含有大量的缺失值。所以对缺失的值进行填充。将其填充为NOT PROVIDED。
data['contbr_employer'].fillna('NOT PROVIDED',inplace=True)
data['contbr_occupation'].fillna('NOT PROVIDED',inplace=True)
2.数据转换
利用字典映射进行转换:党派分析
美国大选一般都是共和党和民主党的较量,数据中没有党派这一项,但是可以通过候选人cand_nm来统计候选人,并最后找出这些候选人的党派。
# 查看数据中总统候选人都有谁
print('共有{}位候选人,分别是'.format(len(data['cand_nm'].unique())))
print(data['cand_nm'].unique())
自行百度这些候选人的党派,并建立字典parties,键:候选人姓名;值:候选人党派
parties = {'Bachmann, Michelle': 'Republican',
'Cain, Herman': 'Republican',
'Gingrich, Newt': 'Republican',
'Huntsman, Jon': 'Republican',
'Johnson, Gary Earl': 'Republican',
'McCotter, Thaddeus G': 'Republican',
'Obama, Barack': 'Democrat',
'Paul, Ron': 'Republican',
'Pawlenty, Timothy': 'Republican',
'Perry, Rick': 'Republican',
"Roemer, Charles E. 'Buddy' III": 'Republican',
'Romney, Mitt': 'Republican',
'Santorum, Rick': 'Republican'}
增加一列party存储党派信息
# 通过map映射函数,增加一列party存储党派信息
data['party'] = data['cand_nm'].map(parties)
# 查看两个党派的情况
print(data['party'].value_counts())
按照职业汇总对赞助总金额进行排序
data.groupby('contbr_occupation')['contb_receipt_amt'].sum().sort_values(ascending=False)[:20]
可以看出有很多职业出现重复,例如CEO和C.E.O。
建立一个职业对应字典,接下来把相同职业的不同格式合并在一起。
occupation_map = {
'INFORMATION REQUESTED PER BEST EFFORTS':'NOT PROVIDED',
'INFORMATION REQUESTED':'NOT PROVIDED',
'SELF' : 'SELF-EMPLOYED',
'SELF EMPLOYED' : 'SELF-EMPLOYED',
'C.E.O.':'CEO',
'LAWYER':'ATTORNEY',
}
# 如果不在字典中,返回x
f = lambda x: occupation_map.get(x, x)
data.contbr_occupation = data.contbr_occupation.map(f)
同上模仿对职业信息转换,对雇主信息进行类似转换
# 同样地,对雇主信息进行类似转换
emp_mapping = {
'INFORMATION REQUESTED PER BEST EFFORTS': 'NOT PROVIDED',
'INFORMATION REQUESTED': 'NOT PROVIDED',
'SELF': 'SELF-EMPLOYED',
'SELF EMPLOYED': 'SELF-EMPLOYED',
}
# 如果不在字典中,返回x
f = lambda x: emp_mapping.get(x, x)
data.contbr_employer = data.contbr_employer.map(f)
3.数据筛选
对赞助金额筛选,限定条件(赞助金额必须大于0)
data = data[data['contb_receipt_amt'] > 0]
对候选人筛选,查看候选人获得的总赞助
# 查看各候选人获得的赞助总金额
data.groupby('cand_nm')['contb_receipt_amt'].sum().sort_values(ascending=False)
可以看出赞助基本集中在Obama、Romney两人。选取候选人为Obama、Romney的子集数据
#选取候选人为Obama、Romney的子集数据
data_vs = data[data['cand_nm'].isin(['Obama, Barack','Romney, Mitt'])].copy()
4.面元化数据
接下来我们对该数据做另一种非常实用的分析,利用cut函数根据出资额大小将数据离散化到多个面元中
bins = np.array([0,1,10,100,1000,10000,100000,1000000,10000000])
labels = pd.cut(data_vs['contb_receipt_amt'],bins)
labels