分组计算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]