Pandas(Special)--综合练习

这篇博客探讨了使用Pandas进行数据分析的实践案例,包括计算企业收入的多样性,通过熵指标进行分析;转换组队学习信息表,实现特定数据形态,并解决美国大选投票情况的问题,如筛选投票数超人口一半的县,以及进行州级选举数据分析。
摘要由CSDN通过智能技术生成


1 企业收入的多样性

在这里插入图片描述

>>>df1 = pd.read_csv('company.csv')
>>>df2 = pd.read_csv('company_data.csv')
>>>df1.head()
	证券代码	日期
0	#000007	2014
1	#000403	2015
2	#000408	2016
3	#000408	2017
4	#000426	2015
>>>df2.head()
    证券代码	日期	    收入类型	 收入额
0	1	    2008/12/31	1	     1.084218e+10
1	1	    2008/12/31	2	     1.259789e+10
2	1	    2008/12/31	3	     1.451312e+10
3	1	    2008/12/31	4	     1.063843e+09
4	1	    2008/12/31	5	     8.513880e+08
  • 答案:
    • 整体思路:首先计算出表2中的收入熵指标(按年的),然后按照证券代码和日期与表1连接(证券代码和日期的格式注意)
    • 【代码】
    # 导入模块与读取文件
    import numpy as np
    import pandas as pd
    df1=pd.read_csv('Company.csv')
    df2=pd.read_csv('Company_data.csv')
    
    # 将表2的日期格式统一
    df2['日期']=df2['日期'].\
    	apply(lambda x:''.join(x[:4])).astype('int64') # 将对象转换为指定类型
    print(df2['日期'].head())
    print(df1['日期'].head())
    
    0    2008
    1    2008
    2    2008
    3    2008
    4    2008
    Name: 日期, dtype: int64
    0    2014
    1    2015
    2    2016
    3    2017
    4    2015
    Name: 日期, dtype: int64
    
    # 定义计算收入熵指标的函数
    
    

    绕进去了,暂时想不清楚了

    # 将表1的证券代码格式统一
    df1_copy=df1.copy()
    df1['证券代码']=df1_copy['证券代码'].apply(lambda x:''.join(x[1:])).astype('int64')
    print(df1['证券代码'].head())
    print(df2['证券代码'].head())
    
    0      7
    1    403
    2    408
    3    408
    4    426
    Name: 证券代码, dtype: int64
    0    1
    1    1
    2    1
    3    1
    4    1
    Name: 证券代码, dtype: int64
    
    # 将表2和表1连接
    
    

参考1.
参考2.

2 组队学习信息表的变换

【题目描述】请把组队学习的队伍信息表变换为如下形态,其中“是否队长”一列取1表示队长,否则为0

	是否队长	队伍名称	    昵称    	编号
0	1	    你说的都对队	山枫叶纷飞	5
1	0	    你说的都对队	蔡	        6
2	0	    你说的都对队	安慕希	    7
3	0	    你说的都对队	信仰	    8
4	0	    你说的都对队	biubiu🙈🙈	20
...	...	    ...	        ...	        ...
141	0	    七星联盟	    Daisy	    63
142	0	    七星联盟    	One Better	131
143	0	    七星联盟    	rain	    112
144	1	    应如是	    思无邪	    54
145	0	    应如是	    Justzer0	58
  • 答案:
    没什么思路。。。。

3 美国大选投票情况

【题目描述】两张数据表中分别给出了美国各县(county)的人口数以及大选的投票情况,请解决以下问题:

  • 有多少县满足总投票数超过县人口数的一半

    • 答案:
    import numpy as np
    import pandas as pd
    # 读取两个表
    df_cand=pd.read_csv('president_county_candidate.csv')
    df_pop=pd.read_csv('county_population.csv')
    print(df_cand.head())
    print(df_pop.head())
    
    	      state             county      candidate party  total_votes    won
    0  Delaware        Kent County      Joe Biden   DEM        44552   True
    1  Delaware        Kent County   Donald Trump   REP        41009  False
    2  Delaware        Kent County   Jo Jorgensen   LIB         1044  False
    3  Delaware        Kent County  Howie Hawkins   GRN          420  False
    4  Delaware  New Castle County      Joe Biden   DEM       195034   True
    
                      US County  Population
    0  .Autauga County, Alabama       55869
    1  .Baldwin County, Alabama      223234
    2  .Barbour County, Alabama       24686
    3     .Bibb County, Alabama       22394
    4   .Blount County, Alabama       57826
    

    因为最终求的是县的个数,而从上可以看到两个表的county名格式不一致,需要转化为一致的

    # 对人口表中的县进行格式修改
    # 替换.并且切片到,
    df_pop['US County']=df_pop['US County']\
        .apply(lambda x:x.replace('.','').split(',')[0])
    print(df_pop.head())
    
            US County  Population
    0  Autauga County       55869
    1  Baldwin County      223234
    2  Barbour County       24686
    3     Bibb County       22394
    4   Blount County       57826
    

    自己的方法太复杂,借鉴了 参考,使用了字典的方式,不知道有没有其他的简便方法

    # 建立字典,键为县名,值为人口数。
    dic_pop={x:y for x,y in zip(df_pop['US County']
                            ,df_pop['Population'])}
    print(len(dic_pop))
    # 1877
    
    # 从投票表中取出州名和投票数字段,建立字典。
    # 遍历字典,若投票数大于人口数的1/2,结果加一
    dic_cand=df_cand.groupby('county')['total_votes'].sum().to_dict()
    res=0
    for k,v in dic_cand.items():
        if k in dic_pop and v > dic_pop[k]//2:
            res+=1
    print(res)
    
  • 把州(state)作为行索引,把投票候选人作为列名,列名的顺序按照候选人在全美的总票数由高到低排序,行列对应的元素为该候选人在该州获得的总票数

    # 此处是一个样例,实际的州或人名用原表的英语代替
                拜登   川普
    威斯康星州   2      1
    德克萨斯州   3      4
    
    • 答案:
    # 长表变宽表
    res=df_cand.pivot_table(index='state'
                        ,columns='candidate'
                        ,values='total_votes'
                        ,aggfunc='sum')
    # 排序
    columns_name= res.sum(0)\
    .sort_values(ascending=False).index.tolist()
    # 变形
    res=res.reindex(index=res.index,columns=columns_name)
    print(res)
    

  • 每一个州下设若干县,定义拜登在该县的得票率减去川普在该县的得票率为该县的BT指标,若某个州所有县BT指标的中位数大于0,则称该州为Biden State,请找出所有的Biden State

  • 答案:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值