<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          整理了 25 個 Pandas 實用技巧,拿走不謝!

          共 5850字,需瀏覽 12分鐘

           ·

          2020-08-17 19:09

          點擊上方Python知識圈,設為星標

          回復1024獲取Python資料



          閱讀文本大概需要 8?分鐘


          點擊「閱讀原文」查看pk哥原創(chuàng)精品視頻。

          本文一共為大家分享25個pandas技巧。

          顯示已安裝的版本

          輸入下面的命令查詢pandas版本:

          1In?[7]:pd.__version__
          2Out[7]:?0.24.2


          如果你還想知道pandas所依賴的模塊的版本,你可以使用show_versions()函數(shù):

           1In?[9]:
          2pd.show_versions()
          3
          4INSTALLED?VERSIONS?
          5------------------?
          6commit:?None?
          7python:?3.7.3.final.0?
          8python-bits:?64?
          9OS:?Darwin?
          10OS-release:?18.6.0?
          11machine:?x86_64?
          12processor:?i386?
          13byteorder:?little?
          14LC_ALL:?None?
          15LANG:?en_US.UTF-8?
          16LOCALE:?en_US.UTF-8?
          17
          18pandas:?0.24.2?
          19pytest:?None?
          20pip:?19.1.1?
          21setuptools:?41.0.1?
          22Cython:?None?
          23numpy:?1.16.4?
          24scipy:?None?
          25pyarrow:?None?
          26xarray:?None?
          27IPython:?7.5.0?
          28sphinx:?None?
          29patsy:?None?
          30dateutil:?2.8.0?
          31pytz:?2019.1?
          32blosc:?None?
          33bottleneck:?None?
          34tables:?None?
          35numexpr:?None?
          36feather:?None?
          37matplotlib:?3.1.0?
          38openpyxl:?None?
          39xlrd:?None?
          40xlwt:?None?
          41xlsxwriter:?None?
          42lxml.etree:?None?
          43bs4:?None?
          44html5lib:?None?
          45sqlalchemy:?None?
          46pymysql:?None?
          47psycopg2:?None?
          48jinja2:?2.10.1?
          49s3fs:?None?
          50fastparquet:?None?
          51pandas_gbq:?None?
          52pandas_datareader:?None?
          53gcsfs:?None


          你可以查看到Python,pandas, Numpy, matplotlib等的版本信息。


          創(chuàng)建示例DataFrame


          假設你需要創(chuàng)建一個示例DataFrame。有很多種實現(xiàn)的途徑,我最喜歡的方式是傳一個字典給DataFrame constructor,其中字典中的keys為列名,values為列的取值。



          現(xiàn)在如果你需要創(chuàng)建一個更大的DataFrame,上述方法則需要太多的輸入。在這種情況下,你可以使用Numpy的random.rand()函數(shù),告訴它行數(shù)和列數(shù),將它傳遞給DataFrame constructor:




          這種方式很好,但如果你還想把列名變?yōu)榉菙?shù)值型的,你可以強制地將一串字符賦值給columns參數(shù)




          你可以想到,你傳遞的字符串的長度必須與列數(shù)相同。


          更改列名


          讓我們來看一下剛才我們創(chuàng)建的示例DataFrame:




          我更喜歡在選取pandas列的時候使用點(.),但是這對那么列名中含有空格的列不會生效。讓我們來修復這個問題。


          更改列名最靈活的方式是使用rename()函數(shù)。你可以傳遞一個字典,其中
          keys為原列名,values為新列名,還可以指定axis:

          1In?[14]:
          2df?=?df.rename({?col?one?:?col_one?,??col?two?:?col_two?},?axis=?columns?)


          使用這個函數(shù)最好的方式是你需要更改任意數(shù)量的列名,不管是一列或者全部的列。


          如果你需要一次性重新命令所有的列名,更簡單的方式就是
          重寫DataFrame的columns屬性

          1In?[15]:
          2df.columns?=?[?col_one?,??col_two?]


          如果你需要做的僅僅是將空格換成下劃線,那么更好的辦法是使用str.replace()方法,這是因為你都不需要輸入所有的列名:

          1In?[16]:
          2df.columns?=?df.columns.str.replace(???,??_?)


          上述三個函數(shù)的結果都一樣,可以更改列名使得列名中不含有空格:




          最后,如果你需要在列名中添加前綴或者后綴,你可以使用add_prefix()函數(shù)




          或者使用add_suffix()函數(shù)



          行序反轉


          讓我們來看一下drinks這個DataFame:

          1In?[20]:
          2drinks.head()
          3
          4Out[20]:



          countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
          0Afghanistan0000.0Asia
          1Albania89132544.9Europe
          2Algeria250140.7Africa
          3Andorra24513831212.4Europe
          4Angola21757455.9Africa


          該數(shù)據(jù)集描述了每個國家的平均酒消費量。如果你想要將行序反轉呢?

          最直接的辦法是使用loc函數(shù)并傳遞::-1,跟Python中列表反轉時使用的切片符號一致:

          1In?[21]:
          2drinks.loc[::-1].head()
          3
          4Out[21]:



          countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
          192Zimbabwe641844.7Africa
          191Zambia321942.5Africa
          190Yemen6000.1Asia
          189Vietnam111212.0Asia
          188Venezuela33310037.7South America

          如果你還想重置索引使得它從0開始呢?


          你可以使用
          reset_index()函數(shù),告訴他去掉完全拋棄之前的索引

          1In?[22]:
          2drinks.loc[::-1].reset_index(drop=True).head()
          3
          4Out[22]:



          countrybeer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcoholcontinent
          0Zimbabwe641844.7Africa
          1Zambia321942.5Africa
          2Yemen6000.1Asia
          3Vietnam111212.0Asia
          4Venezuela33310037.7South America


          你可以看到,行序已經(jīng)反轉,索引也被重置為默認的整數(shù)序號。


          列序反轉


          跟之前的技巧一樣,你也可以使用loc函數(shù)將列從左至右反轉:

          1In?[23]:
          2drinks.loc[:,?::-1].head()
          3
          4Out[23]:



          continenttotal_litres_of_pure_alcoholwine_servingsspirit_servingsbeer_servingscountry
          0Asia0.0000Afghanistan
          1Europe4.95413289Albania
          2Africa0.714025Algeria
          3Europe12.4312138245Andorra
          4Africa5.94557217Angola


          逗號之前的冒號表示選擇所有行,逗號之后的::-1表示反轉所有的列,這就是為什么country這一列現(xiàn)在在最右邊。


          通過數(shù)據(jù)類型選擇列

          這里有drinks這個DataFrame的數(shù)據(jù)類型:

           1In?[24]:
          2drinks.dtypes
          3
          4Out[24]:
          5country??????????????????????????object
          6beer_servings?????????????????????int64
          7spirit_servings???????????????????int64
          8wine_servings?????????????????????int64
          9total_litres_of_pure_alcohol????float64
          10continent????????????????????????object
          11dtype:?object


          假設你僅僅需要選取數(shù)值型的列,那么你可以使用select_dtypes()函數(shù)

          1In?[25]:
          2drinks.select_dtypes(include=?number?).head()
          3
          4Out[25]:



          beer_servingsspirit_servingswine_servingstotal_litres_of_pure_alcohol
          00000.0
          189132544.9
          2250140.7
          324513831212.4
          421757455.9


          這包含了int和float型的列。


          你也可以使用這個函數(shù)來選取數(shù)據(jù)類型為object的列:




          你還可以選取多種數(shù)據(jù)類型,只需要傳遞一個列表即可:




          你還可以用來排除特定的數(shù)據(jù)類型:



          將字符型轉換為數(shù)值型

          讓我們來創(chuàng)建另一個示例DataFrame:




          這些數(shù)字實際上儲存為字符型,導致其數(shù)據(jù)類型為object:




          為了對這些列進行數(shù)學運算,我們需要將數(shù)據(jù)類型轉換成數(shù)值型。你可以對前兩列使用astype()函數(shù)




          但是,如果你對第三列也使用這個函數(shù),將會引起錯誤,這是因為這一列包含了破折號(用來表示0)但是pandas并不知道如何處理它。

          你可以對第三列使用to_numeric()函數(shù),告訴其將任何無效數(shù)據(jù)轉換為NaN:




          如果你知道NaN值代表0,那么你可以fillna()函數(shù)將他們替換成0:




          最后,你可以通過apply()函數(shù)一次性對整個DataFrame使用這個函數(shù):




          僅需一行代碼就完成了我們的目標,因為現(xiàn)在所有的數(shù)據(jù)類型都轉換成float:



          減小DataFrame空間大小


          pandas DataFrame被設計成可以適應內存,所以有些時候你可以減小DataFrame的空間大小,讓它在你的系統(tǒng)上更好地運行起來。


          這是drinks這個DataFrame所占用的空間大小:




          可以看到它使用了30.4KB。


          如果你對你的DataFrame有操作方面的問題,或者你不能將它讀進內存,那么在讀取文件的
          過程中有兩個步驟可以使用來減小DataFrame的空間大小。


          第一個步驟是只讀取那些你實際上需要用到的列,可以調用usecols參數(shù):




          通過僅讀取用到的兩列,我們將DataFrame的空間大小縮小至13.6KB。


          第二步是將所有實際上為類別變量的object列轉換成類別變量,可以調用dtypes參數(shù):




          通過將continent列讀取為category數(shù)據(jù)類型,我們進一步地把DataFrame的空間大小縮小至2.3KB。


          值得注意的是,如果跟行數(shù)相比,category數(shù)據(jù)類型的列數(shù)相對較小,那么catefory數(shù)據(jù)類型可以減小內存占用。


          按行從多個文件中構建DataFrame

          假設你的數(shù)據(jù)集分化為多個文件,但是你需要將這些數(shù)據(jù)集讀到一個DataFrame中。


          舉例來說,我有一些關于股票的小數(shù)聚集,每個數(shù)據(jù)集為單天的CSV文件。這是第一天的:




          這是第二天的:




          這是第三天的:




          你可以將每個CSV文件讀取成DataFrame,將它們結合起來,然后再刪除原來的DataFrame,但是這樣會多占用內存且需要許多代碼


          更好的方式為使用內置的glob模塊。你可以給glob()函數(shù)傳遞某種模式,包括未知字符,這樣它會返回符合該某事的文件列表。在這種方式下,glob會查找所有以stocks開頭的CSV文件:




          glob會返回任意排序的文件名,這就是我們?yōu)槭裁匆肞ython內置的sorted()函數(shù)來對列表進行排序。


          我們以生成器表達式用read_csv()函數(shù)來讀取每個文件,并將結果傳遞給concat()函數(shù),這會將單個的DataFrame按行來組合:




          不幸的是,索引值存在重復。為了避免這種情況,我們需要告訴concat()函數(shù)來忽略索引,使用默認的整數(shù)索引:



          按列從多個文件中構建DataFrame


          上一個技巧對于數(shù)據(jù)集中每個文件包含行記錄很有用。但是如果數(shù)據(jù)集中的每個文件包含的列信息呢?


          這里有一個例子,dinks數(shù)據(jù)集被劃分成兩個CSV文件,每個文件包含三列:




          同上一個技巧一樣,我們以使用glob()函數(shù)開始。這一次,我們需要告訴concat()函數(shù)按列來組合:




          現(xiàn)在我們的DataFrame已經(jīng)有六列了。


          作者:『博客園』山陰少年?

          www.cnblogs.com/jclian91/p/12305471.html



          -----------------------
          公眾號:Python知識圈
          博客:www.pyzhishiquan.com
          知乎Python知識圈
          微信視頻號:菜鳥程序員 (分享有趣的編程技巧、Python技巧)
          bilibili:菜鳥程序員的日常(目前原創(chuàng)視頻:22,累計播放量:75萬)


          我的微信視頻號定時更新中,近期真人出鏡分析講解 Python 經(jīng)典習題,后續(xù)會分享更多的干貨,歡迎關注我的微信視頻號。


          Python知識圈公眾號的交流群已經(jīng)建立,群里可以領取 Python 相關學習資料,大家可以一起學習交流,效率更高,如果是想發(fā)推文、廣告、砍價小程序的敬請繞道!一定記得備注「交流學習」,不然不會通過好友。

          掃碼添加,備注:交流學習




          往期推薦
          01

          公眾號所有文章匯總導航(2-10更新)

          02

          Github上有趣的100個Python項目

          03

          打基礎一定要吃透這12類 Python 內置函數(shù)


          我就知道你“在看”

          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本一级片免费 | 亚洲精品午夜成人片DY888 | 天天躁日日躁人妻久久澡 | 夜色婷婷少妇丰满久久 | 久久久久三级片AV |