丞相弩的pandas基础笔记
pandas笔记
pandas数据分析
pandas是Python的一个数据处理的模块,是一个表格处理器。用Python做数据分析,pandas是必不可少的。
首先必须要导入这个pandas库:
之后我们就可以开始使用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_帝二排行榜| Aztecs | 54.40% | +9% | 6.12% | -14% | 36:12 |
| Berbers | 42.99% | -3% | 1.70% | +31% | 54:29 |
| Britons | 50.15% | +10% | 5.24% | +32% | 32:05 |
| Bulgarians | 44.07% | +15% | 0.93% | +34% | 26:21 |
| Burmese | 46.67% | +9% | 1.19% | -15% | 31:22 |
| Byzantines | 51.72% | -1% | 1.38% | +62% | 33:07 |
| Celts | 50.95% | -8% | 6.65% | +19% | 33:27 |
| Chinese | 52.76% | +9% | 4.02% | - | 29:50 |
| … | … | … | … | … | … |
| Slavs | 54.12% | +25% | 1.35% | -4% | 31:11 |
| Spanish | 49.44% | -10% | 2.85% | -32% | 31:49 |
| Tatars | 47.50% | +14% | 1.27% | -59% | 35:46 |
| Teutons | 58.76% | +7% | 2.80% | +256% | 42:11 |
| Turks | 52.38% | +2% | 1.00% | +23% | 42:55 |
| Vietnamese | 57.53% | +9% | 1.16% | +7% | 31:11 |
| Vikings | 44.77% | -6% | 4.39% | +65% | 39:51 |
第三则是直接拿一个Excel表格来读取。
df = pd.read_csv ("20春_pandas_week02_hurun_unicorn.tsv", encoding = "utf8", sep="\t") df| 1 | 蚂蚁金服 | Ant Financial | 10000 | 中国 | 杭州 | 金融科技 | 井贤栋 | 2014 | 春华资本、中投海外、红杉资本 |
| 2 | 字节跳动 | Bytedance | 5000 | 中国 | 北京 | 媒体和娱乐 | 张一鸣 | 2012 | 红杉资本、海纳亚洲、纪源资本、启明创投 |
| 3 | 滴滴出行 | Didi Chuxing | 3600 | 中国 | 北京 | 共享经济 | 程维 | 2012 | 腾讯、阿里巴巴、红杉资本、经纬中国、纪源资本 |
| 4 | Infor | Infor | 3500 | 美国 | 纽约 | 云计算 | Jim Schaper | 2002 | Golden Gate Capital, Koch Equity Development |
| 5 | JUUL Labs | JUUL Labs | 3400 | 美国 | 旧金山 | 消费品 | Adam Bowen, James Monsees, Kevin Burns, Tim Da... | 2015 | M13, Timothy Davis, Evolution VC Partners, Tig... |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 264 | Zeta Global | Zeta Global | 70 | 美国 | 纽约 | 人工智能 | David A. Steinberg, John Sculley | 2007 | GPI Capital, GSO Capital Partners |
| 264 | 掌门1对1 | Zhangmen | 70 | 中国 | 上海 | 教育科技 | 张翼 | 2014 | 顺为资本、达晨创投、华平投资 |
| 264 | 转转 | Zhuanzhuan | 70 | 中国 | 北京 | 电子商务 | 姚劲波 | 2015 | 腾讯 |
| 264 | Zipline International | Zipline International | 70 | 美国 | 半月湾 | 物流 | Keenan Wyrobek, Keller Rinaudo, Will Hetzler | 2014 | Sequoia Capital, Visionnaire Ventures, Katalys... |
| 264 | ZipRecruiter | ZipRecruiter | 70 | 美国 | 洛杉矶 | 电子商务 | Ian Siegel, Joe Edmonds, Ward Poulos, Willis Redd | 2010 | IVP (Institutional Venture Partners) |
拿到了数据之后就可以分析了。
set_index和reset_index
set_index可以把表头的某一元素变成索引
df.set_index('企业名称')| 1 | Ant Financial | 10000 | 中国 | 杭州 | 金融科技 | 井贤栋 | 2014 | 春华资本、中投海外、红杉资本 |
| 2 | Bytedance | 5000 | 中国 | 北京 | 媒体和娱乐 | 张一鸣 | 2012 | 红杉资本、海纳亚洲、纪源资本、启明创投 |
| 3 | Didi Chuxing | 3600 | 中国 | 北京 | 共享经济 | 程维 | 2012 | 腾讯、阿里巴巴、红杉资本、经纬中国、纪源资本 |
| 4 | Infor | 3500 | 美国 | 纽约 | 云计算 | Jim Schaper | 2002 | Golden Gate Capital, Koch Equity Development |
| 5 | JUUL Labs | 3400 | 美国 | 旧金山 | 消费品 | Adam Bowen, James Monsees, Kevin Burns, Tim Da... | 2015 | M13, Timothy Davis, Evolution VC Partners, Tig... |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 264 | Zeta Global | 70 | 美国 | 纽约 | 人工智能 | David A. Steinberg, John Sculley | 2007 | GPI Capital, GSO Capital Partners |
| 264 | Zhangmen | 70 | 中国 | 上海 | 教育科技 | 张翼 | 2014 | 顺为资本、达晨创投、华平投资 |
| 264 | Zhuanzhuan | 70 | 中国 | 北京 | 电子商务 | 姚劲波 | 2015 | 腾讯 |
| 264 | Zipline International | 70 | 美国 | 半月湾 | 物流 | Keenan Wyrobek, Keller Rinaudo, Will Hetzler | 2014 | Sequoia Capital, Visionnaire Ventures, Katalys... |
| 264 | ZipRecruiter | 70 | 美国 | 洛杉矶 | 电子商务 | Ian Siegel, Joe Edmonds, Ward Poulos, Willis Redd | 2010 | IVP (Institutional Venture Partners) |
这样,企业名称就变成了了索引。
用reset_index()可以把它变回来。
- set_index虽然方便,但只能改变一个索引。
- reset_index可以把groupby处理过的表格变回原样。
agg()函数
首先是agg()分类函数,这个函数可以为我们统计表格中的某些项目,统计它们的count数量、max最大值、mean中位数、min最小值和sum总量。
df.agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"]})| 494.0 | NaN | NaN |
| NaN | NaN | 2019.0 |
| NaN | 238.805668 | NaN |
| NaN | NaN | 2000.0 |
| NaN | 117970.000000 | NaN |
- 在初始表格df中,我们可以看出企业名称确实是有494个。
- 从代码可以看出来——我们只让它统计企业名称的个数count,估值的均值mean和总数sum,以及成立年份的最大值max和最小值min。
groupby()函数
groupby顾名思义就是分组用的函数,但是并不能单独使用,同样以我们的初始表格为例,和agg()一起使用。我们在里面的by属性先后添加国家、行业,它会把国家放在左边,之后把该国家所有的行业集中在一起,达到一个分组的效果。
df.groupby ( by = ['国家','行业'] ).agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"], })| 5 | 460 | 92.000000 | 2015 | 2011 |
| 15 | 2090 | 139.333333 | 2016 | 2009 |
| 13 | 2060 | 158.461538 | 2019 | 2000 |
| 8 | 4740 | 592.500000 | 2016 | 2011 |
| 4 | 1250 | 312.500000 | 2017 | 2013 |
| ... | ... | ... | ... | ... |
| 1 | 350 | 350.000000 | 2007 | 2007 |
| 1 | 200 | 200.000000 | 2011 | 2011 |
| 3 | 740 | 246.666667 | 2010 | 2005 |
| 1 | 70 | 70.000000 | 2011 | 2011 |
| 1 | 150 | 150.000000 | 2017 | 2017 |
同样我们把行业和国家调换位置,它会把行业放到左边,然后把有这个行业的国家全部集中起来。达到一个分组的效果。这就是groupby分组函数的使用方法。
df.groupby ( by = ['行业','国家'] ).agg ({ "企业名称" : "count", \"估值(亿人民币)":["sum","mean"], \"成立年份":["max","min"], })| 3 | 370 | 123.333333 | 2015 | 2011 |
| 5 | 460 | 92.000000 | 2015 | 2011 |
| 4 | 440 | 110.000000 | 2013 | 2010 |
| 1 | 200 | 200.000000 | 2012 | 2012 |
| 1 | 150 | 150.000000 | 2000 | 2000 |
| ... | ... | ... | ... | ... |
| 1 | 200 | 200.000000 | 2013 | 2013 |
| 1 | 300 | 300.000000 | 2005 | 2005 |
| 21 | 5020 | 239.047619 | 2017 | 2000 |
| 6 | 1250 | 208.333333 | 2015 | 2011 |
| 1 | 70 | 70.000000 | 2011 | 2011 |
sort_values()函数
该函数可以对内容进行排序。
例如我们要根据估值总数sum的大小来对表格进行一个从大到小的排序,就可以用到这个sort_values()函数,ascending的值可以设置升降序。
| 22 | 17960 | 816.363636 | 2018 | 2002 |
| 17 | 8230 | 484.117647 | 2015 | 2003 |
| 32 | 6880 | 215.000000 | 2015 | 2000 |
| 6 | 5670 | 945.000000 | 2017 | 2008 |
| 21 | 5020 | 239.047619 | 2017 | 2000 |
| ... | ... | ... | ... | ... |
| 1 | 70 | 70.000000 | 2014 | 2014 |
| 1 | 70 | 70.000000 | 2016 | 2016 |
| 1 | 70 | 70.000000 | 2006 | 2006 |
| 1 | 70 | 70.000000 | 2013 | 2013 |
| 1 | 70 | 70.000000 | 2013 | 2013 |
这样的话,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":"最早"} )| 22 | 17960 | 816.363636 | 2018 | 2002 |
| 17 | 8230 | 484.117647 | 2015 | 2003 |
| 32 | 6880 | 215.000000 | 2015 | 2000 |
| 6 | 5670 | 945.000000 | 2017 | 2008 |
| 21 | 5020 | 239.047619 | 2017 | 2000 |
| ... | ... | ... | ... | ... |
| 1 | 70 | 70.000000 | 2014 | 2014 |
| 1 | 70 | 70.000000 | 2016 | 2016 |
| 1 | 70 | 70.000000 | 2006 | 2006 |
| 1 | 70 | 70.000000 | 2013 | 2013 |
| 1 | 70 | 70.000000 | 2013 | 2013 |
之后我们将目光投向“部分投资机构”
从这张截图中我们可以看出,每一个机构都是用顿号“、”进行分隔,因此我们可以利用这个“、”来进行分割。
- split表示以"、"为分隔符对字符串进行分割
- expand=True,这个参数直接将分列后的结果转换成DataFrame。
| 春华资本 | 中投海外 | 红杉资本 | None | None | None |
| 红杉资本 | 海纳亚洲 | 纪源资本 | 启明创投 | None | None |
| 腾讯 | 阿里巴巴 | 红杉资本 | 经纬中国 | 纪源资本 | None |
| Golden Gate Capital, Koch Equity Development | None | None | None | None | None |
| M13, Timothy Davis, Evolution VC Partners, Tig... | None | None | None | None | None |
| ... | ... | ... | ... | ... | ... |
| GPI Capital, GSO Capital Partners | None | None | None | None | None |
| 顺为资本 | 达晨创投 | 华平投资 | None | None | None |
| 腾讯 | None | None | None | None | None |
| Sequoia Capital, Visionnaire Ventures, Katalys... | None | None | None | None | None |
| IVP (Institutional Venture Partners) | None | None | None | None | None |
我们可以看出,最后一列“部分投资机构”已经被分割并制成表格了。
此外,可以用一些方法来判断表格中的元素是否包含某些字符。
- isnumeric 判断是否为数字(没什么卵用,先留着看看)
数据透视
drop()删除方法
先做一些准备,将企业名称和掌门人\创始人提取出来做成一个新表格。
df_独角兽_创始人_准备 =df[["企业名称","掌门人/创始人"]]| 蚂蚁金服 | 井贤栋 |
| 字节跳动 | 张一鸣 |
| 滴滴出行 | 程维 |
| Infor | Jim Schaper |
| JUUL Labs | Adam Bowen, James Monsees, Kevin Burns, Tim Da... |
| ... | ... |
| Zeta Global | David A. Steinberg, John Sculley |
| 掌门1对1 | 张翼 |
| 转转 | 姚劲波 |
| Zipline International | Keenan Wyrobek, Keller Rinaudo, Will Hetzler |
| ZipRecruiter | Ian Siegel, Joe Edmonds, Ward Poulos, Willis Redd |
| 蚂蚁金服 |
| 字节跳动 |
| 滴滴出行 |
| 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_准备合并的列)| 0 | 井贤栋 |
| 1 | 张一鸣 |
| 2 | 程维 |
| 3 | Jim Schaper |
| 4 | Adam Bowen |
| ... | ... |
| 492 | Will Hetzler |
| 493 | Ian Siegel |
| 493 | Joe Edmonds |
| 493 | Ward Poulos |
| 493 | Willis Redd |
merge()合并相同序号的元素
df_独角兽_创始人 = pd.merge(df_待合并,df_准备合并的列,on= "序号")| 蚂蚁金服 | 井贤栋 |
| 字节跳动 | 张一鸣 |
| 滴滴出行 | 程维 |
| Infor | Jim Schaper |
| JUUL Labs | Adam Bowen |
| ... | ... |
| Zipline International | Will Hetzler |
| ZipRecruiter | Ian Siegel |
| ZipRecruiter | Joe Edmonds |
| ZipRecruiter | Ward Poulos |
| ZipRecruiter | Willis Redd |
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("百度")]| 红杉资本、晨兴资本、百度、腾讯 | 快手 |
| 百度、红杉资本、真格基金 | 蜜芽 |
| 百度、闻名投资 | 新潮传媒 |
| 百度、蔚来资本 | 首汽约车 |
| IDG、赛富基金、百度 | 我买网 |
数据框排序(sorted_values)
首先我们要弄一个展开的表格,把所有的数据全部展开(由于实在太长了,所以我只看前8行)。
-
Series.sort_index (By index)
按系列索引排序。 -
DataFrame.sort_values (By values)
通过沿任一轴的值对DataFrame进行排序。 -
DataFrame.sort_index (By index)
按索引对DataFrame进行排序。
| 170.0 | 170.0 | 200.0 | 200.0 | 100.0 | 300.0 | 2380.0 | 1280.0 | 710.0 | 950.0 | 1590.0 | 6570.0 | 11330.0 | 5340.0 | 16150.0 | 3960.0 | 1300.0 | 810.0 | 1090.0 | 100.0 |
| NaN | NaN | 150.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 210.0 | 150.0 | 150.0 | 70.0 | NaN | NaN | NaN | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | NaN | NaN | NaN | NaN | NaN |
| 150.0 | NaN | NaN | NaN | 150.0 | NaN | NaN | 70.0 | 840.0 | NaN | 1300.0 | 440.0 | 140.0 | 350.0 | 270.0 | NaN | 70.0 | 70.0 | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 500.0 | 700.0 | 70.0 | 300.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | 70.0 | 370.0 | NaN | NaN | NaN | NaN | NaN | NaN |
| 150.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | NaN | 150.0 | 370.0 | 200.0 | 70.0 | NaN | NaN | NaN | NaN | NaN |
之后我们就可以来排序了,但还是只看前8行。
国_年_估值_展开.sort_index(by=2002,axis=0, ascending=False).head(8)| 210.0 | 210.0 | 6270.0 | 420.0 | 1550.0 | 840.0 | 810.0 | 2650.0 | 4570.0 | 2090.0 | 6150.0 | 2620.0 | 4670.0 | 3840.0 | 2220.0 | 5980.0 | 1690.0 | 870.0 | NaN | 70.0 |
| 170.0 | 170.0 | 200.0 | 200.0 | 100.0 | 300.0 | 2380.0 | 1280.0 | 710.0 | 950.0 | 1590.0 | 6570.0 | 11330.0 | 5340.0 | 16150.0 | 3960.0 | 1300.0 | 810.0 | 1090.0 | 100.0 |
| NaN | NaN | 150.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 210.0 | 150.0 | 150.0 | 70.0 | NaN | NaN | NaN | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | NaN | NaN | NaN | NaN | NaN |
| 150.0 | NaN | NaN | NaN | 150.0 | NaN | NaN | 70.0 | 840.0 | NaN | 1300.0 | 440.0 | 140.0 | 350.0 | 270.0 | NaN | 70.0 | 70.0 | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 500.0 | 700.0 | 70.0 | 300.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | NaN | NaN | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 70.0 | 70.0 | 370.0 | NaN | NaN | NaN | NaN | NaN | NaN |
sorted_values根据属性by对数据进行排序,by=2002时,我们根据2002年的数据对整个表格进行从大到小的排序。
pivot()函数
pivot()指定列index、行columns、值values,是非常方便的函数。我还是只放前8行。
国_年_估值_pivot = 分进合击初阶.reset_index().pivot(index = '成立年份',columns='国家' ,values='估值(亿人民币)' )| 170.0 | NaN | NaN | 150.0 | NaN | NaN | NaN | 150.0 | NaN | NaN | ... | NaN | NaN | 210.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 170.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 210.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 200.0 | 150.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 6270.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 200.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 420.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 100.0 | NaN | NaN | 150.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 1550.0 | NaN | 350.0 | NaN | NaN | NaN | NaN | NaN |
| 300.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | 300.0 | NaN | 840.0 | NaN | 150.0 | NaN | NaN | NaN | 70.0 | NaN |
| 2380.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 810.0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
| 1280.0 | NaN | NaN | 70.0 | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | 2650.0 | NaN | NaN | NaN | NaN | NaN | 350.0 | NaN |
总结
以上是生活随笔为你收集整理的丞相弩的pandas基础笔记的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 开发APP|酒店管理APP开发特点
- 下一篇: html 案例演练 文章的编辑 2003