《利用Python进行数据分析》初阶例题分析-4:2012年联邦选举委员会数据库

这里写目录标题

    • 题目描述
    • 源数据集
    • 数据分析

题目描述

美国联邦选举委员会公布了有关政治运动贡献的数据。这些数据包括捐赠者姓名、职业和雇主、地址和缴费金额。你可以尝试做一下的分析:
按职业和雇主的捐赠统计
按捐赠金额统计
按州进行统计

源数据集

点此获得该系列1-4数据
提取码:if5a

数据分析

加载数据

fec = pd.read_csv("datasets/fec/P00000001-ALL.csv", low_memory=False)
fec.info()
fec.iloc[123456]
unique_cands = fec["cand_nm"].unique()
unique_cands
unique_cands[2]

在这里插入图片描述
定义一个包含所有选举委员的大字典
fec[“cand_nm”][123456:123461]:提取"dataframe"中"cand_nm"列索引为123456到123460的行的值。

fec[“cand_nm”][123456:123461].map(parties):对刚才提取的值进行映射操作,使用名为"parties"的函数。

fec[“party”] = fec[“cand_nm”].map(parties):将"cand_nm"列映射后的结果赋值给新的列"party"。

fec[“party”].value_counts():统计"party"列中每个值出现的次数。

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"}
fec["cand_nm"][123456:123461]
fec["cand_nm"][123456:123461].map(parties)
# Add it as a column
fec["party"] = fec["cand_nm"].map(parties)
fec["party"].value_counts()

下面的四行代码功能如下: 统计"contb_receipt_amt"列中大于0的值的次数,并返回结果。 将"contb_receipt_amt"列中大于0的行筛选出来,并将结果赋值给变量"fec"。 从"fec"数据帧中选择出"cand_nm"列值为"Obama, Barack"或"Romney, Mitt"的行,并将结果赋值给变量"fec_mrbo"。 统计"contbr_occupation"列中每个职业值出现的次数,并返回前10个结果。

(fec["contb_receipt_amt"] > 0).value_counts()
fec = fec[fec["contb_receipt_amt"] > 0]
fec_mrbo = fec[fec["cand_nm"].isin(["Obama, Barack", "Romney, Mitt"])]
fec["contbr_occupation"].value_counts()[:10]

在这里插入图片描述
代码提供了一个将职业和雇主名称映射到特定值的映射字典,并使用该映射更新名为“fec”的DataFrame中的"contbr_occupation"和"contbr_employer"列。

在进行映射后,代码使用"contb_receipt_amt"作为值,"contbr_occupation"作为索引,“party"作为列,创建了一个数据透视表。聚合函数选用了"sum”。

最后,代码选择数据透视表中特定职业的贡献总和大于200万的行。

occ_mapping = {
   "INFORMATION REQUESTED PER BEST EFFORTS" : "NOT PROVIDED",
   "INFORMATION REQUESTED" : "NOT PROVIDED",
   "INFORMATION REQUESTED (BEST EFFORTS)" : "NOT PROVIDED",
   "C.E.O.": "CEO"
}

def get_occ(x):
    # If no mapping provided, return x
    return occ_mapping.get(x, x)

fec["contbr_occupation"] = fec["contbr_occupation"].map(get_occ)
emp_mapping = {
   "INFORMATION REQUESTED PER BEST EFFORTS" : "NOT PROVIDED",
   "INFORMATION REQUESTED" : "NOT PROVIDED",
   "SELF" : "SELF-EMPLOYED",
   "SELF EMPLOYED" : "SELF-EMPLOYED",
}

def get_emp(x):
    # If no mapping provided, return x
    return emp_mapping.get(x, x)

fec["contbr_employer"] = fec["contbr_employer"].map(get_emp)
by_occupation = fec.pivot_table("contb_receipt_amt",
                                index="contbr_occupation",
                                columns="party", aggfunc="sum")
over_2mm = by_occupation[by_occupation.sum(axis="columns") > 2000000]
over_2mm

在这里插入图片描述
在这里插入图片描述
函数get_top_amounts接受三个参数:group、key和n。

group是通过使用groupby()函数获得的分组DataFrame。 key是我们想要根据其对数据进行分组的列名。 n是我们想要获取的前n个最大值的数量。 在函数内部,它首先根据key列中的值进一步对group DataFrame进行分组。然后,使用sum()函数对每个组的contb_receipt_amt金额进行求和。

最后,它使用nlargest()函数基于先前获得的总金额获取前n个最大值。

def get_top_amounts(group, key, n=5):
    totals = group.groupby(key)["contb_receipt_amt"].sum()
    return totals.nlargest(n)

首先使用groupby()函数将fec_mrbo按照候选人姓名进行分组,然后分别使用get_top_amounts函数对"contbr_occupation"和"contbr_employer"这两个特征进行分组分析。

get_top_amounts函数的作用是获取指定特征中出现频率最高的前n个值,然后将这些值的频率和出现次数返回。这里的n参数指定了要获取的前n个值。

grouped = fec_mrbo.groupby("cand_nm")
grouped.apply(get_top_amounts, "contbr_occupation", n=7)
grouped.apply(get_top_amounts, "contbr_employer", n=10)

在这里插入图片描述
先使用numpy中的np.array()函数创建了一个数组bins,其中包含了一些分割点。然后使用pandas中的pd.cut()函数将fec_mrbo[“contb_receipt_amt”]中的数据根据这些分割点进行了分组,并为每个分组分配了一个标签。

bins = np.array([0, 1, 10, 100, 1000, 10000,
                 100_000, 1_000_000, 10_000_000])
labels = pd.cut(fec_mrbo["contb_receipt_amt"], bins)
labels

这段代码首先使用groupby()函数对fec_mrbo数据集按cand_nm和labels进行分组,然后使用grouped.size().unstack(level=0)计算每个分组中的元素数量,并将结果转换为数据框的形式。

grouped = fec_mrbo.groupby(["cand_nm", labels])
grouped.size().unstack(level=0)

在这里插入图片描述
这段代码首先使用groupby()函数对fec_mrbo数据集按cand_nm和contbr_st进行分组,然后使用grouped[“contb_receipt_amt”].sum().unstack(level=0)计算每个分组中contb_receipt_amt的总和,并将结果转换为数据框的形式。

然后,使用bucket_sums.sum(axis=“columns”)计算每行的总和,并使用bucket_sums.div(bucket_sums.sum(axis=“columns”), axis=“index”)将每个分组中的值除以每行的总和,得到归一化的结果normed_sums。

最后,使用normed_sums[:-2].plot(kind=“barh”)将最后两行(“Other”和“Unknown”)的数据从normed_sums中剔除,并绘制水平条形图来可视化结果。

bucket_sums = grouped["contb_receipt_amt"].sum().unstack(level=0)
normed_sums = bucket_sums.div(bucket_sums.sum(axis="columns"),
                              axis="index")
normed_sums
normed_sums[:-2].plot(kind="barh")

在这里插入图片描述
首先使用Pandas库中的groupby()函数将数据集fec_mrbo按cand_nm和contbr_st进行分组。

然后,使用grouped[“contb_receipt_amt”].sum()计算每个分组中contb_receipt_amt的总和。接着,使用unstack(level=0)将层次化的结果转换为数据框的形式,并使用fillna(0)将缺失值填充为0。

接下来,使用totals.sum(axis=“columns”)计算每行的总和,并将结果大于100000的行筛选出来得到新的数据框totals。最后,使用totals.head(10)查看新的数据框中的前10行。

grouped = fec_mrbo.groupby(["cand_nm", "contbr_st"])
totals = grouped["contb_receipt_amt"].sum().unstack(level=0).fillna(0)
totals = totals[totals.sum(axis="columns") > 100000]
totals.head(10)

在这里插入图片描述
计算出对应的百分比,并列出前十行

percent = totals.div(totals.sum(axis="columns"), axis="index")
percent.head(10)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值