利用python对2012美国大选进行数据分析(三,数据聚合与分组运算)

分组计算Grouping,分组运算是一个“split-apply-combine”的过程:

  • 拆分,pandas对象中的数据会根据你所提供的一个或多个键被拆分为多组
  • 应用,将一个函数应用到各个分组并产生一个新值
  • 合并,所有这些函数的执行结果会合并到最终的结果对象中

1.透视表(pivot_table)分析党派和职业

我们可以通过pivot_table根据党派和职业对数据进行聚合,然后过滤掉总出资不足200万美元的数据:

#按照党派、职业对赞助金额进行汇总,类似excel中的透视表操作,聚合函数为sum
by_occupation = data.pivot_table('contb_receipt_amt',index='contbr_occupation',columns='party',aggfunc='sum')
#过滤掉赞助金额小于200W的数据
over_2mm = by_occupation[by_occupation.sum(1)>2000000]
print(over_2mm)

# 共和党和民主党选举分布直方图
over_2mm.plot(kind='bar')
plt.show()

2 .分组级运算和转换

根据职业与雇主信息分组运算

我们接下来了解一下对Obama和Romney总出资最高的职业和雇主。注意,这里巧妙地利用了dict.get,它允许没有映射关系的职业也能“通过”

# 由于职业和雇主的处理非常相似,我们定义函数get_top_amounts()对两个字段进行分析处理

def get_top_amounts(group, key, n=5):
    # 传入groupby分组后的对象,返回按照key字段汇总的排序前n的数据
    totals = group.groupby(key)['contb_receipt_amt'].sum()
    return totals.sort_values(ascending=False)[:n]

grouped = data_vs.groupby('cand_nm')

print(grouped.apply(get_top_amounts, 'contbr_occupation', n=7))

从数据可以看出,Obama更受精英群体(律师、医生、咨询顾问)的欢迎,Romney则得到更多企业家或企业高管的支持

同样的,使用get_top_amounts()对捐款人所在公司进行分析处理

grouped.apply(get_top_amounts,'contbr_employer',n=10)

Obama:微软、盛德国际律师事务所; Romney:瑞士瑞信银行、摩根斯坦利、高盛公司、巴克莱资本、H.I.G.资本

对赞助金额进行分组分析(matplotlib画图)

前面用pd.cut()函数,根据出资额大小将数据离散化到多个面元中,接下来我们就要对每个离散化的面元进行分组分析

首先统计各出资区间的赞助笔数,这里用到unstack()函数就是不要堆叠,即把多层索引变为表格数据

# abels是之前赞助金额离散化后的Series
grouped_bins = data_vs.groupby(['cand_nm',labels])
print(grouped_bins.size().unstack(0))

接下来,我们再统计各区间的赞助金额

bucket_sums=grouped_bins['contb_receipt_amt'].sum().unstack(0)
print(bucket_sums)

Obama、Romney各区间赞助总金额

bucket_sums.plot(kind='bar')
plt.show()

上图虽然能够大概看出Obama、Romney的赞助金额区间分布,但对比并不够突出,如果用百分比堆积图效果会更好,下面我们就实现以下。

算出每个区间两位候选人收到赞助总金额的占比

normed_sums = bucket_sums.div(bucket_sums.sum(axis=1),axis=0)
print(normed_sums)

 使用柱状图,指定stacked=True进行堆叠,即可完成百分比堆积图

normed_sums[:-2].plot(kind='bar',stacked=True)
plt.show()

可以看出,小额赞助方面,Obama获得的数量和金额比Romney多得多

按照赞助人姓名分组计数,计算重复赞助次数最多的前20人

data.groupby('contbr_nm')['contbr_nm'].count().sort_values(ascending=False)[:20]

猜你喜欢

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