Pandas学习——综合练习

任务一:企业收入的多样性

一个企业的产业收入多样性可以仿照信息熵的概念来定义收入熵指标:
I = − ∑ i p ( x i ) log ⁡ ( p ( x i ) ) \rm I=-\sum_{i}p(x_i)\log(p(x_i)) I=ip(xi)log(p(xi))
其中 p ( x i ) \rm p(x_i) p(xi)是企业该年某产业收入额占该年所有产业总收入的比重。在 company.csv 中存有需要计算的企业和年份,在 company_data.csv 中存有企业、各类收入额和收入年份的信息。现请利用后一张表中的数据,在前一张表中增加一列表示该公司该年份的收入熵指标。

df1 = pd.read_csv('G:/代码/joyful-pandas-master/lx/company.csv')
df1.head()
证券代码日期
0#0000072014
1#0004032015
2#0004082016
3#0004082017
4#0004262015
df2 = pd.read_csv('G:/代码/joyful-pandas-master/lx/company_data.csv')
df2.head()
证券代码日期收入类型收入额
012008/12/3111.084218e+10
112008/12/3121.259789e+10
212008/12/3131.451312e+10
312008/12/3141.063843e+09
412008/12/3158.513880e+08
# 把df1和df2的格式统一,方便后面做连接
# 把df1的'证券代码'转成和df2一样的格式
df1['证券代码'] = df1['证券代码'].str[1:].astype('int')
# 提取df2的日期里的年份
df2['日期'] = df2['日期'].str[:4].astype('int')  
# 按照日期和证券代码分组,求出每年中每个证券的总收入额
tep1 = df2.groupby(['证券代码','日期']).sum()
tep1 = tep1.reset_index(['证券代码']) 
tep1.head() 
证券代码收入类型收入额
日期
200811057.284498e+10
20091364.771900e+10
20101789.940944e+10
201117412.762728e+11
201213512.775925e+11
# 按照日期分组,求出每年所有证券的总收入额
tep2 = df2[['日期','收入额']].groupby(['日期']).sum()
tep2.head() 
收入额
日期
20088.254845e+13
20091.423517e+14
20101.893949e+14
20112.857002e+14
20123.888834e+14
# 通过以日期为主键的连接,将每年总收入额加到tep1
tep = tep1.merge(tep2,on=['日期'],how='left',suffixes=['','_总'])  
# 计算P(x_i)
tep['P'] = tep['收入额']/tep['收入额_总']
tep.head() 
证券代码收入类型收入额收入额_总P
日期
200811057.284498e+108.254845e+130.000882
20091364.771900e+101.423517e+140.000335
20101789.940944e+101.893949e+140.000525
201117412.762728e+112.857002e+140.000967
201213512.775925e+113.888834e+140.000714
# 按照证券代码和日期进行分组,在每个组利用熵公式计算每个证券代码对应的熵
tep = tep[['证券代码','P']].groupby(['证券代码','日期']).agg(lambda x:-sum(x*np.log2(abs(x)))) 
# 此处取绝对值是因为存在收入为负的异常值,考虑到收入不可能为负,故取绝对值
tep.head() 
P
证券代码日期
120080.008954
20090.003869
20100.005719
20110.009684
20120.007461
# 将计算得到的结果以证券代码为主键与df做连接
df1.merge(tep, on=['证券代码','日期'], how='left').rename(columns = {'P':'I'}).head()    
证券代码日期I
0720140.000176
140320150.000359
240820160.001492
34082017NaN
442620150.000676

任务二:组队学习信息表的变换

请把组队学习的队伍信息表变换为如下形态,其中“是否队长”一列取1表示队长,否则为0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8oAVaXhf-1609603332854)(attachment:image.png)]

df = pd.read_excel('G:/代码/joyful-pandas-master/lx/Team_Pandas.xlsx')
df.head() 
所在群队伍名称队长编号队长_群昵称队员1 编号队员_群昵称队员2 编号队员_群昵称.1队员3 编号队员_群昵称.2...队员6 编号队员_群昵称.5队员7 编号队员_群昵称.6队员8 编号队员_群昵称.7队员9 编号队员_群昵称.8队员10编号队员_群昵称.9
0Pandas数据分析你说的都对队5山枫叶纷飞67.0安慕希8.0信仰...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
1Pandas数据分析熊猫人175鱼呲呲44Heaven37.0吕青50.0余柳成荫...25.0Never say never55.0K120.0Y.28.0X.Y.Q151.0swrong
2Pandas数据分析中国移不动107Y's124🥕75.0Vito146.0张小五...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
3Pandas数据分析panda11太下真君35柚子108.0My42.0星星点灯...157.0Zys158.0不器102.0嘉平佑染NaNNaNNaNNaN
4Pandas数据分析一路向北13黄元帅1516.0未期18.0太陽光下...23.0🚀169.0听风189.0CappuccinoNaNNaNNaNNaN

5 rows × 24 columns

pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=‘value’, col_level=None)

  • frame:要处理的数据集。

  • id_vars:不需要被转换的列名。

  • value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了。

  • var_name和value_name是自定义设置对应的列名。

  • col_level :如果列是MultiIndex,则使用此级别。

tep1 = df.melt(id_vars = ['所在群', '队伍名称'],
                value_vars = [ '队长编号', '队员1 编号', '队员2 编号','队员3 编号', '队员4 编号', '队员5 编号', '队员6 编号',  '队员7 编号', '队员8 编号','队员9 编号','队员10编号'],
                var_name = '是否队长',
                value_name = '编号')
tep1['是否队长']=tep1['是否队长'].apply(lambda x: 1 if x=='队长编号' else 0)
tep1.head() 
所在群队伍名称是否队长编号
0Pandas数据分析你说的都对队15.0
1Pandas数据分析熊猫人1175.0
2Pandas数据分析中国移不动1107.0
3Pandas数据分析panda111.0
4Pandas数据分析一路向北113.0
tep2 = df.melt(id_vars = ['所在群', '队伍名称'],
                value_vars = [ '队长_群昵称', '队员_群昵称','队员_群昵称.1',  '队员_群昵称.2', '队员_群昵称.3','队员_群昵称.4','队员_群昵称.5', '队员_群昵称.6','队员_群昵称.7','队员_群昵称.8','队员_群昵称.9'],
                var_name = '昵称类型',
                value_name = '昵称')
tep2.head() 
所在群队伍名称昵称类型昵称
0Pandas数据分析你说的都对队队长_群昵称山枫叶纷飞
1Pandas数据分析熊猫人队长_群昵称鱼呲呲
2Pandas数据分析中国移不动队长_群昵称Y's
3Pandas数据分析panda队长_群昵称太下真君
4Pandas数据分析一路向北队长_群昵称黄元帅
df=pd.concat([tep1,tep2[['昵称']]],axis=1)
df.head() 
所在群队伍名称是否队长编号昵称
0Pandas数据分析你说的都对队15.0山枫叶纷飞
1Pandas数据分析熊猫人1175.0鱼呲呲
2Pandas数据分析中国移不动1107.0Y's
3Pandas数据分析panda111.0太下真君
4Pandas数据分析一路向北113.0黄元帅
df = df[['是否队长','队伍名称','昵称','编号']]
df.sort_values(by=['队伍名称','是否队长'],ascending=False,inplace=True)
df.dropna(inplace=True)
df['编号']=df['编号'].astype(int)
df.head()
是否队长队伍名称昵称编号
131鲲鲲玩Python木南居士26
340鲲鲲玩Python冻草莓187
550鲲鲲玩PythonShawn61
51西部战车老狼149
260西部战车Robin or Michael51

任务三:美国大选投票情况

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

  • 有多少县满足总投票数超过县人口数的一半
  • 把州(state)作为行索引,把投票候选人作为列名,列名的顺序按照候选人在全美的总票数由高到低排序,行列对应的元素为该候选人在该州获得的总票数
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YehtvgCq-1609603332860)(attachment:image.png)]
  • 每一个州下设若干县,定义拜登在该县的得票率减去川普在该县的得票率为该县的BT指标,若某个州所有县BT指标的中位数大于0,则称该州为Biden State,请找出所有的Biden State
df1 = pd.read_csv('G:/代码/joyful-pandas-master/lx/county_population.csv')
df1.head() 
US CountyPopulation
0.Autauga County, Alabama55869
1.Baldwin County, Alabama223234
2.Barbour County, Alabama24686
3.Bibb County, Alabama22394
4.Blount County, Alabama57826
df2 = pd.read_csv('G:/代码/joyful-pandas-master/lx/president_county_candidate.csv')
df2['US County'] = '.'+df2['county']+', '+df2['state'] 
# 把州和县组合起来生成唯一的US County值,因为存在重名的县
df2.head() 
statecountycandidatepartytotal_voteswonUS County
0DelawareKent CountyJoe BidenDEM44552True.Kent County, Delaware
1DelawareKent CountyDonald TrumpREP41009False.Kent County, Delaware
2DelawareKent CountyJo JorgensenLIB1044False.Kent County, Delaware
3DelawareKent CountyHowie HawkinsGRN420False.Kent County, Delaware
4DelawareNew Castle CountyJoe BidenDEM195034True.New Castle County, Delaware

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

# 从US County中提取出州和县的信息,方便后面统计按州或县信息
df1['state'] = df1['US County'].str.split(",").apply(lambda x:x[1]) 
df1['county'] = df1['US County'].str.split(",").apply(lambda x:x[0][1:]) 
df1.head() 
US CountyPopulationstatecounty
0.Autauga County, Alabama55869AlabamaAutauga County
1.Baldwin County, Alabama223234AlabamaBaldwin County
2.Barbour County, Alabama24686AlabamaBarbour County
3.Bibb County, Alabama22394AlabamaBibb County
4.Blount County, Alabama57826AlabamaBlount County
# 求出每个县的总投票数
tep = df2[['US County','total_votes']].groupby(['US County']).sum() 
# 因为存在存在重名的县,所以按照州和县的组合US County来进行分组求和
tep.head()  
total_votes
US County
.Abbeville County, South Carolina12433
.Abbot, Maine417
.Abington, Massachusetts9660
.Acadia Parish, Louisiana28425
.Accomack County, Virginia16962
# 把计算得到的每个县的total_votes与df1连接
tep1 = df1.merge(tep,on=['US County'],how='left')
tep1.head() 
US CountyPopulationstatecountyJoe BidenDonald TrumpBT
0.Autauga County, Alabama55869AlabamaAutauga County7503.019838.0-12335.0
1.Baldwin County, Alabama223234AlabamaBaldwin County24578.083544.0-58966.0
2.Barbour County, Alabama24686AlabamaBarbour County4816.05622.0-806.0
3.Bibb County, Alabama22394AlabamaBibb County1986.07525.0-5539.0
4.Blount County, Alabama57826AlabamaBlount County2640.024711.0-22071.0
# 对满足条件的县进行计数
tep1[tep1['total_votes']>0.5*tep1['Population']].count()[0]  
1434

重新排序

# 以州为行索引,以候选人为列索引,计算出总得票数
tep = df2.pivot_table(index='state', columns='candidate', values='total_votes',aggfunc = 'sum')  
tep = tep.fillna(0)
tep.head()
candidateNone of these candidatesWrite-insAlyson KennedyBill HammonsBlake HuberBrian CarrollBrock PierceBrooke PaigeChristopher LaFontaineConnie Gammon...Mark CharlesPhil CollinsPresident BoddiePrincess Jacob-FambroRichard DuncanRicki Sue KingRocky De La FuenteSheila Samm TittleTom HoeflingZachary Scalf
state
Alabama0.07312.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
Alaska0.034210.00.00.00.00.0825.00.00.00.0...0.00.00.00.00.00.0318.00.00.00.0
Arizona0.02032.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
Arkansas0.00.00.00.00.01713.02141.00.00.01475.0...0.02812.00.00.00.00.01321.00.00.00.0
California0.080.00.00.00.00.00.00.00.00.0...0.00.00.00.00.00.060155.00.00.00.0

5 rows × 38 columns

# 求出候选人的得票总数,然后进行排序,把排序的结果作为tep的列
L = df2.groupby('candidate').sum().sort_values(by='total_votes', ascending=False).index
L 
Index(['Joe Biden', 'Donald Trump', 'Jo Jorgensen', 'Howie Hawkins',
       ' Write-ins', 'Rocky De La Fuente', 'Gloria La Riva', 'Kanye West',
       'Don Blankenship', 'Brock Pierce', 'Brian Carroll',
       ' None of these candidates', 'Alyson Kennedy', 'Bill Hammons',
       'Jerome Segal', 'Dario Hunter', 'Jade Simmons', 'Phil Collins',
       'Joe McHugh', 'Jesse Ventura', 'Mark Charles', 'Sheila Samm Tittle',
       'Connie Gammon', 'John Richard Myers', 'Brooke Paige',
       'President Boddie', 'Christopher LaFontaine', 'Kyle Kopitke',
       'Tom Hoefling', 'Ricki Sue King', 'Princess Jacob-Fambro',
       'Blake Huber', 'Richard Duncan', 'Joseph Kishore', 'Jordan Scott',
       'Gary Swing', 'Keith McCormic', 'Zachary Scalf'],
      dtype='object', name='candidate')
tep.reindex(columns=L).head() 
candidateJoe BidenDonald TrumpJo JorgensenHowie HawkinsWrite-insRocky De La FuenteGloria La RivaKanye WestDon BlankenshipBrock Pierce...Tom HoeflingRicki Sue KingPrincess Jacob-FambroBlake HuberRichard DuncanJoseph KishoreJordan ScottGary SwingKeith McCormicZachary Scalf
state
Alabama849648.01441168.025176.00.07312.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
Alaska153405.0189892.08896.00.034210.0318.00.00.01127.0825.0...0.00.00.00.00.00.00.00.00.00.0
Arizona1672143.01661686.051465.00.02032.00.00.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0
Arkansas423932.0760647.013133.02980.00.01321.01336.04099.02108.02141.0...0.00.00.00.00.00.00.00.00.00.0
California11109764.06005961.0187885.081025.080.060155.051036.00.00.00.0...0.00.00.00.00.00.00.00.00.00.0

5 rows × 38 columns

找出所有的Biden State

# 以县为行索引,以候选人为列索引,计算出总得票数
tep = df2.pivot_table(index='US County', columns='candidate', values='total_votes',aggfunc = 'sum')[['Joe Biden','Donald Trump']]  
tep = tep.fillna(0)
tep.head() 
candidateJoe BidenDonald Trump
US County
.Abbeville County, South Carolina4101.08215.0
.Abbot, Maine121.0288.0
.Abington, Massachusetts5209.04236.0
.Acadia Parish, Louisiana5443.022596.0
.Accomack County, Virginia7578.09172.0
# 计算BT指标
tep['BT'] = tep['Joe Biden']-tep['Donald Trump'] 
tep
tep.head() 
candidateJoe BidenDonald TrumpBT
US County
.Abbeville County, South Carolina4101.08215.0-4114.0
.Abbot, Maine121.0288.0-167.0
.Abington, Massachusetts5209.04236.0973.0
.Acadia Parish, Louisiana5443.022596.0-17153.0
.Accomack County, Virginia7578.09172.0-1594.0
tep = tep.reset_index(['US County'])  
tep['state'] = tep['US County'].str.split(",").apply(lambda x:x[1])
tep.head()
candidateUS CountyJoe BidenDonald TrumpBTstate
0.Abbeville County, South Carolina4101.08215.0-4114.0South Carolina
1.Abbot, Maine121.0288.0-167.0Maine
2.Abington, Massachusetts5209.04236.0973.0Massachusetts
3.Acadia Parish, Louisiana5443.022596.0-17153.0Louisiana
4.Accomack County, Virginia7578.09172.0-1594.0Virginia
sum(tep.groupby('state').agg('median')['BT']>0) 
9
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值