欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

丞相弩的pandas基础笔记

发布时间:2024/3/24 编程问答 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 丞相弩的pandas基础笔记 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

pandas笔记

pandas数据分析

pandas是Python的一个数据处理的模块,是一个表格处理器。用Python做数据分析,pandas是必不可少的。
首先必须要导入这个pandas库:

import pandas as pd

之后我们就可以开始使用pandas了。首先我们要一个表格,表格的获取有三种办法,第一是用字典方法:

第二是用爬虫来爬

import requests import lxml import pandas as pd from lxml import etree res = requests.get('https://aoestats.io/stats/RM_1v1/1650+') res_elements = etree.HTML(res.text) table = res_elements.xpath('//*[@id="gatsby-focus-wrapper"]/div/div/main/table') table = etree.tostring(table[0], encoding='utf-8').decode()df_帝二排行榜 = pd.read_html(table, encoding='utf-8', header=0)[0] results = list(df_帝二排行榜.T.to_dict().values()) # 转换成列表嵌套字典的格式 df_帝二排行榜 CivilizationWin RateUnnamed: 2Play RateUnnamed: 4Game Length01234567…28293031323334
Aztecs54.40%+9%6.12%-14%36:12
Berbers42.99%-3%1.70%+31%54:29
Britons50.15%+10%5.24%+32%32:05
Bulgarians44.07%+15%0.93%+34%26:21
Burmese46.67%+9%1.19%-15%31:22
Byzantines51.72%-1%1.38%+62%33:07
Celts50.95%-8%6.65%+19%33:27
Chinese52.76%+9%4.02%-29:50
Slavs54.12%+25%1.35%-4%31:11
Spanish49.44%-10%2.85%-32%31:49
Tatars47.50%+14%1.27%-59%35:46
Teutons58.76%+7%2.80%+256%42:11
Turks52.38%+2%1.00%+23%42:55
Vietnamese57.53%+9%1.16%+7%31:11
Vikings44.77%-6%4.39%+65%39:51

第三则是直接拿一个Excel表格来读取。

df = pd.read_csv ("20春_pandas_week02_hurun_unicorn.tsv", encoding = "utf8", sep="\t") df 排名企业名称Company Name估值(亿人民币)国家城市行业掌门人/创始人成立年份部分投资机构01234...489490491492493
1蚂蚁金服Ant Financial10000中国杭州金融科技井贤栋2014春华资本、中投海外、红杉资本
2字节跳动Bytedance5000中国北京媒体和娱乐张一鸣2012红杉资本、海纳亚洲、纪源资本、启明创投
3滴滴出行Didi Chuxing3600中国北京共享经济程维2012腾讯、阿里巴巴、红杉资本、经纬中国、纪源资本
4InforInfor3500美国纽约云计算Jim Schaper2002Golden Gate Capital, Koch Equity Development
5JUUL LabsJUUL Labs3400美国旧金山消费品Adam Bowen, James Monsees, Kevin Burns, Tim Da...2015M13, Timothy Davis, Evolution VC Partners, Tig...
..............................
264Zeta GlobalZeta Global70美国纽约人工智能David A. Steinberg, John Sculley2007GPI Capital, GSO Capital Partners
264掌门1对1Zhangmen70中国上海教育科技张翼2014顺为资本、达晨创投、华平投资
264转转Zhuanzhuan70中国北京电子商务姚劲波2015腾讯
264Zipline InternationalZipline International70美国半月湾物流Keenan Wyrobek, Keller Rinaudo, Will Hetzler2014Sequoia Capital, Visionnaire Ventures, Katalys...
264ZipRecruiterZipRecruiter70美国洛杉矶电子商务Ian Siegel, Joe Edmonds, Ward Poulos, Willis Redd2010IVP (Institutional Venture Partners)

拿到了数据之后就可以分析了。

set_index和reset_index

set_index可以把表头的某一元素变成索引

df.set_index('企业名称') 排名Company Name估值(亿人民币)国家城市行业掌门人/创始人成立年份部分投资机构企业名称蚂蚁金服字节跳动滴滴出行InforJUUL Labs...Zeta Global掌门1对1转转Zipline InternationalZipRecruiter
1Ant Financial10000中国杭州金融科技井贤栋2014春华资本、中投海外、红杉资本
2Bytedance5000中国北京媒体和娱乐张一鸣2012红杉资本、海纳亚洲、纪源资本、启明创投
3Didi Chuxing3600中国北京共享经济程维2012腾讯、阿里巴巴、红杉资本、经纬中国、纪源资本
4Infor3500美国纽约云计算Jim Schaper2002Golden Gate Capital, Koch Equity Development
5JUUL Labs3400美国旧金山消费品Adam Bowen, James Monsees, Kevin Burns, Tim Da...2015M13, Timothy Davis, Evolution VC Partners, Tig...
...........................
264Zeta Global70美国纽约人工智能David A. Steinberg, John Sculley2007GPI Capital, GSO Capital Partners
264Zhangmen70中国上海教育科技张翼2014顺为资本、达晨创投、华平投资
264Zhuanzhuan70中国北京电子商务姚劲波2015腾讯
264Zipline International70美国半月湾物流Keenan Wyrobek, Keller Rinaudo, Will Hetzler2014Sequoia Capital, Visionnaire Ventures, Katalys...
264ZipRecruiter70美国洛杉矶电子商务Ian Siegel, Joe Edmonds, Ward Poulos, Willis Redd2010IVP (Institutional Venture Partners)

这样,企业名称就变成了了索引。
用reset_index()可以把它变回来。

df.reset_index()
  • set_index虽然方便,但只能改变一个索引。
  • reset_index可以把groupby处理过的表格变回原样。

agg()函数

首先是agg()分类函数,这个函数可以为我们统计表格中的某些项目,统计它们的count数量、max最大值、mean中位数、min最小值和sum总量。

df.agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"]}) 企业名称估值(亿人民币)成立年份countmaxmeanminsum
494.0NaNNaN
NaNNaN2019.0
NaN238.805668NaN
NaNNaN2000.0
NaN117970.000000NaN
  • 在初始表格df中,我们可以看出企业名称确实是有494个。
  • 从代码可以看出来——我们只让它统计企业名称的个数count,估值的均值mean和总数sum,以及成立年份的最大值max和最小值min。

groupby()函数

groupby顾名思义就是分组用的函数,但是并不能单独使用,同样以我们的初始表格为例,和agg()一起使用。我们在里面的by属性先后添加国家行业,它会把国家放在左边,之后把该国家所有的行业集中在一起,达到一个分组的效果。

df.groupby ( by = ['国家','行业'] ).agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"], }) 企业名称估值(亿人民币)成立年份countsummeanmaxmin国家行业中国云计算人工智能健康科技共享经济区块链......韩国游戏物流电子商务金融科技马耳他区块链
546092.00000020152011
152090139.33333320162009
132060158.46153820192000
84740592.50000020162011
41250312.50000020172013
...............
1350350.00000020072007
1200200.00000020112011
3740246.66666720102005
17070.00000020112011
1150150.00000020172017

同样我们把行业和国家调换位置,它会把行业放到左边,然后把有这个行业的国家全部集中起来。达到一个分组的效果。这就是groupby分组函数的使用方法。

df.groupby ( by = ['行业','国家'] ).agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"], }) 企业名称估值(亿人民币)成立年份countsummeanmaxmin行业国家3D印刷美国云计算中国以色列澳大利亚爱尔兰......金融科技德国瑞典美国英国韩国
3370123.33333320152011
546092.00000020152011
4440110.00000020132010
1200200.00000020122012
1150150.00000020002000
...............
1200200.00000020132013
1300300.00000020052005
215020239.04761920172000
61250208.33333320152011
17070.00000020112011

sort_values()函数

该函数可以对内容进行排序。
例如我们要根据估值总数sum的大小来对表格进行一个从大到小的排序,就可以用到这个sort_values()函数,ascending的值可以设置升降序。

# .sort_values ( by = [("估值(亿人民币)","sum")], ascending = False)df.groupby ( by = ['国家','行业'] ).agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"], })\.sort_values ( by = [("估值(亿人民币)","sum")], ascending = False) 企业名称估值(亿人民币)成立年份countsummeanmaxmin国家行业中国金融科技媒体和娱乐美国云计算共享经济金融科技......日本区块链法国人工智能媒体和娱乐爱沙尼亚共享经济法国健康科技
2217960816.36363620182002
178230484.11764720152003
326880215.00000020152000
65670945.00000020172008
215020239.04761920172000
...............
17070.00000020142014
17070.00000020162016
17070.00000020062006
17070.00000020132013
17070.00000020132013

这样的话,sum最多的那一个就被排到最上方了。

rename()函数

rename很明显就是一个改名函数,如果表头是外文很难理解,或者有特殊标点不便于分析,那么我们可以用rename对其进行一个重命名。

df.groupby ( by = ['国家','行业'] ) \.agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"], }) \.sort_values ( by = [("估值(亿人民币)","sum")], ascending = False) \.rename ( columns = {"sum":"总和", "mean":"均值", "count":"数量", "max":"最新", "min":"最早"} ) 企业名称估值(亿人民币)成立年份数量总和均值最新最早国家行业中国金融科技媒体和娱乐美国云计算共享经济金融科技......日本区块链法国人工智能媒体和娱乐爱沙尼亚共享经济法国健康科技
2217960816.36363620182002
178230484.11764720152003
326880215.00000020152000
65670945.00000020172008
215020239.04761920172000
...............
17070.00000020142014
17070.00000020162016
17070.00000020062006
17070.00000020132013
17070.00000020132013

之后我们将目光投向“部分投资机构”


从这张截图中我们可以看出,每一个机构都是用顿号“、”进行分隔,因此我们可以利用这个“、”来进行分割。

df["部分投资机构"].str.split('、',expand=True)split表示以"、"为分隔符对字符串进行分割
  • split表示以"、"为分隔符对字符串进行分割
  • expand=True,这个参数直接将分列后的结果转换成DataFrame。
01234501234...489490491492493
春华资本中投海外红杉资本NoneNoneNone
红杉资本海纳亚洲纪源资本启明创投NoneNone
腾讯阿里巴巴红杉资本经纬中国纪源资本None
Golden Gate Capital, Koch Equity DevelopmentNoneNoneNoneNoneNone
M13, Timothy Davis, Evolution VC Partners, Tig...NoneNoneNoneNoneNone
..................
GPI Capital, GSO Capital PartnersNoneNoneNoneNoneNone
顺为资本达晨创投华平投资NoneNoneNone
腾讯NoneNoneNoneNoneNone
Sequoia Capital, Visionnaire Ventures, Katalys...NoneNoneNoneNoneNone
IVP (Institutional Venture Partners)NoneNoneNoneNoneNone

我们可以看出,最后一列“部分投资机构”已经被分割并制成表格了。

此外,可以用一些方法来判断表格中的元素是否包含某些字符。

  • isnumeric 判断是否为数字(没什么卵用,先留着看看)
df["企业名称"].str.isnumeric() >>> 0 False 1 False 2 False 3 False 4 False... 489 False 490 False 491 False 492 False 493 False Name: 企业名称, Length: 494, dtype: bool

数据透视

drop()删除方法

先做一些准备,将企业名称掌门人\创始人提取出来做成一个新表格。

df_独角兽_创始人_准备 =df[["企业名称","掌门人/创始人"]] 企业名称掌门人/创始人序号01234...489490491492493
蚂蚁金服井贤栋
字节跳动张一鸣
滴滴出行程维
InforJim Schaper
JUUL LabsAdam Bowen, James Monsees, Kevin Burns, Tim Da...
......
Zeta GlobalDavid A. Steinberg, John Sculley
掌门1对1张翼
转转姚劲波
Zipline InternationalKeenan Wyrobek, Keller Rinaudo, Will Hetzler
ZipRecruiterIan Siegel, Joe Edmonds, Ward Poulos, Willis Redd
drop()删除某列,作为准备合并的表格 df_待合并 =df_独角兽_创始人_准备.drop('掌门人/创始人', axis=1) 企业名称序号01234...489490491492493
蚂蚁金服
字节跳动
滴滴出行
Infor
JUUL Labs
...
Zeta Global
掌门1对1
转转
Zipline International
ZipRecruiter

使用drop()方法删除**‘掌门人/创始人’**一列。

准备合并的一对列

df_准备合并的列 =df['掌门人/创始人'].str.split(',', expand=True).stack().reset_index(level=1,drop=True).rename('掌门人/创始人') >>> 序号 0 井贤栋 1 张一鸣 2 程维 3 Jim Schaper 4 Adam Bowen... 492 Will Hetzler 493 Ian Siegel 493 Joe Edmonds 493 Ward Poulos 493 Willis Redd Name: 掌门人/创始人, Length: 911, dtype: object

注意: rename一定要写,相当于给这个表格命名,否则不让合并。

dict_准备合并的列 = {"序号":df_准备合并的列.index,"掌门人/创始人":df_准备合并的列.values} df_准备合并列=pd.DataFrame(dict_准备合并的列) 序号掌门人/创始人01234...906907908909910
0井贤栋
1张一鸣
2程维
3Jim Schaper
4Adam Bowen
......
492Will Hetzler
493Ian Siegel
493Joe Edmonds
493Ward Poulos
493Willis Redd
也可以写成这样 df_独角兽_创始人_准备 =df[["企业名称","掌门人/创始人"]] df_独角兽_创始人_准备.index.name="序号" df_独角兽_创始人 =pd.merge(df_独角兽_创始人_准备.drop('掌门人/创始人', axis=1),\df['掌门人/创始人'].str.split(',', expand=True)\.stack().reset_index(level=1,drop=True).rename('掌门人/创始人'),\on="序号")

merge()合并相同序号的元素

df_独角兽_创始人 = pd.merge(df_待合并,df_准备合并的列,on= "序号") 企业名称掌门人/创始人序号01234...492493493493493
蚂蚁金服井贤栋
字节跳动张一鸣
滴滴出行程维
InforJim Schaper
JUUL LabsAdam Bowen
......
Zipline InternationalWill Hetzler
ZipRecruiterIan Siegel
ZipRecruiterJoe Edmonds
ZipRecruiterWard Poulos
ZipRecruiterWillis Redd
使用这种方法,相当于将数列展开使用,我们可以看最下面4行——企业名称"ZipRecruiter"的企业有4位创始人,于是我们得到了4个493行,4位“掌门人/创始人”一人占一行。

contains()方法

contains()函数可以查询全表格是否包含某些字符,比如我们查查有“红杉资本”的项目。

df["部分投资机构"].str.contains("红杉资本") >>> 0 True 1 True 2 True 3 False 4 False... 489 False 490 False 491 False 492 False 493 False Name: 部分投资机构, Length: 494, dtype: bool

比较系统地使用如下

df_投资方_百度 = df_投资方_企业名称[df_投资方_企业名称["部分投资机构"].str.contains("百度")] 部分投资机构企业名称序号13239260438477
红杉资本、晨兴资本、百度、腾讯快手
百度、红杉资本、真格基金蜜芽
百度、闻名投资新潮传媒
百度、蔚来资本首汽约车
IDG、赛富基金、百度我买网

数据框排序(sorted_values)

首先我们要弄一个展开的表格,把所有的数据全部展开(由于实在太长了,所以我只看前8行)。

  • Series.sort_index (By index)
    按系列索引排序。

  • DataFrame.sort_values (By values)
    通过沿任一轴的值对DataFrame进行排序。

  • DataFrame.sort_index (By index)
    按索引对DataFrame进行排序。

国_年_估值_展开 = df.groupby(by= ["国家","成立年份"]) \.agg({"估值(亿人民币)":"sum"}) \.reset_index() \.set_index(["国家"]) \.pivot(columns="成立年份", values="估值(亿人民币)").head(8) 成立年份20002001200220032004200520062007200820092010201120122013201420152016201720182019国家中国以色列卢森堡印度印度尼西亚哥伦比亚巴西德国
170.0170.0200.0200.0100.0300.02380.01280.0710.0950.01590.06570.011330.05340.016150.03960.01300.0810.01090.0100.0
NaNNaN150.0NaNNaNNaNNaNNaNNaNNaN210.0150.0150.070.0NaNNaNNaNNaNNaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN70.0NaNNaNNaNNaNNaN
150.0NaNNaNNaN150.0NaNNaN70.0840.0NaN1300.0440.0140.0350.0270.0NaN70.070.0NaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaN500.0700.070.0300.0NaNNaNNaNNaNNaNNaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN70.0NaNNaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN70.070.0370.0NaNNaNNaNNaNNaNNaN
150.0NaNNaNNaNNaNNaNNaNNaNNaN70.0NaN150.0370.0200.070.0NaNNaNNaNNaNNaN

之后我们就可以来排序了,但还是只看前8行。

国_年_估值_展开.sort_index(by=2002,axis=0, ascending=False).head(8) 成立年份20002001200220032004200520062007200820092010201120122013201420152016201720182019国家美国中国以色列卢森堡印度印度尼西亚哥伦比亚巴西
210.0210.06270.0420.01550.0840.0810.02650.04570.02090.06150.02620.04670.03840.02220.05980.01690.0870.0NaN70.0
170.0170.0200.0200.0100.0300.02380.01280.0710.0950.01590.06570.011330.05340.016150.03960.01300.0810.01090.0100.0
NaNNaN150.0NaNNaNNaNNaNNaNNaNNaN210.0150.0150.070.0NaNNaNNaNNaNNaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN70.0NaNNaNNaNNaNNaN
150.0NaNNaNNaN150.0NaNNaN70.0840.0NaN1300.0440.0140.0350.0270.0NaN70.070.0NaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaN500.0700.070.0300.0NaNNaNNaNNaNNaNNaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN70.0NaNNaNNaN
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN70.070.0370.0NaNNaNNaNNaNNaNNaN

sorted_values根据属性by对数据进行排序,by=2002时,我们根据2002年的数据对整个表格进行从大到小的排序。

pivot()函数

pivot()指定列index、行columns、值values,是非常方便的函数。我还是只放前8行。

国_年_估值_pivot = 分进合击初阶.reset_index().pivot(index = '成立年份',columns='国家' ,values='估值(亿人民币)' ) 国家中国以色列卢森堡印度印度尼西亚哥伦比亚巴西德国新加坡日本...瑞典瑞士美国芬兰英国菲律宾西班牙阿根廷韩国马耳他成立年份20002001200220032004200520062007
170.0NaNNaN150.0NaNNaNNaN150.0NaNNaN...NaNNaN210.0NaNNaNNaNNaNNaNNaNNaN
170.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN210.0NaNNaNNaNNaNNaNNaNNaN
200.0150.0NaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN6270.0NaNNaNNaNNaNNaNNaNNaN
200.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN420.0NaNNaNNaNNaNNaNNaNNaN
100.0NaNNaN150.0NaNNaNNaNNaNNaNNaN...NaNNaN1550.0NaN350.0NaNNaNNaNNaNNaN
300.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...300.0NaN840.0NaN150.0NaNNaNNaN70.0NaN
2380.0NaNNaNNaNNaNNaNNaNNaNNaNNaN...NaNNaN810.0NaNNaNNaNNaNNaNNaNNaN
1280.0NaNNaN70.0NaNNaNNaNNaNNaNNaN...NaNNaN2650.0NaNNaNNaNNaNNaN350.0NaN

总结

以上是生活随笔为你收集整理的丞相弩的pandas基础笔记的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。