丞相弩的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