利用python对2012美国大选进行数据分析(二,数据清洗)

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

猜你喜欢

转载自blog.csdn.net/jackfjw/article/details/82859305
今日推荐