<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 個(gè) Pandas 實(shí)用技巧,拿走不謝!

          共 7473字,需瀏覽 15分鐘

           ·

          2021-08-06 23:32






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

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


          本文一共為大家分享25個(gè)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


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



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




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




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


          更改列名


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




          我更喜歡在選取pandas列的時(shí)候使用點(diǎn)(.),但是這對(duì)那么列名中含有空格的列不會(huì)生效。讓我們來(lái)修復(fù)這個(gè)問(wèn)題。


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

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


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


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

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


          如果你需要做的僅僅是將空格換成下劃線,那么更好的辦法是使用str.replace()方法,這是因?yàn)槟愣疾恍枰斎胨械牧忻?/span>

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


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




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




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



          行序反轉(zhuǎn)


          讓我們來(lái)看一下drinks這個(gè)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ù)集描述了每個(gè)國(guó)家的平均酒消費(fèi)量。如果你想要將行序反轉(zhuǎn)呢?

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

          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)反轉(zhuǎn),索引也被重置為默認(rèn)的整數(shù)序號(hào)。


          列序反轉(zhuǎn)


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

          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


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


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

          這里有drinks這個(gè)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è)你僅僅需要選取數(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型的列。


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




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




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



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

          讓我們來(lái)創(chuàng)建另一個(gè)示例DataFrame:




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




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




          但是,如果你對(duì)第三列也使用這個(gè)函數(shù),將會(huì)引起錯(cuò)誤,這是因?yàn)檫@一列包含了破折號(hào)(用來(lái)表示0)但是pandas并不知道如何處理它。

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




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




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




          僅需一行代碼就完成了我們的目標(biāo),因?yàn)楝F(xiàn)在所有的數(shù)據(jù)類型都轉(zhuǎn)換成float:



          減小DataFrame空間大小


          pandas DataFrame被設(shè)計(jì)成可以適應(yīng)內(nèi)存,所以有些時(shí)候你可以減小DataFrame的空間大小,讓它在你的系統(tǒng)上更好地運(yùn)行起來(lái)。


          這是drinks這個(gè)DataFrame所占用的空間大?。?/span>




          可以看到它使用了30.4KB。


          如果你對(duì)你的DataFrame有操作方面的問(wèn)題,或者你不能將它讀進(jìn)內(nèi)存,那么在讀取文件的
          過(guò)程中有兩個(gè)步驟可以使用來(lái)減小DataFrame的空間大小。


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




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


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




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


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


          按行從多個(gè)文件中構(gòu)建DataFrame

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


          舉例來(lái)說(shuō),我有一些關(guān)于股票的小數(shù)聚集,每個(gè)數(shù)據(jù)集為單天的CSV文件。這是第一天的:




          這是第二天的:




          這是第三天的:




          你可以將每個(gè)CSV文件讀取成DataFrame,將它們結(jié)合起來(lái),然后再刪除原來(lái)的DataFrame,但是這樣會(huì)多占用內(nèi)存且需要許多代碼


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




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


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




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



          按列從多個(gè)文件中構(gòu)建DataFrame


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


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




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




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



          end



          熱門原創(chuàng)往期:

          80行代碼!用Python做一個(gè)哆來(lái)A夢(mèng)分身
          用Python一鍵生成炫酷九宮格圖片,火了朋友圈
          熬了一夜!我用Python做了一個(gè)網(wǎng)站,幫小姐姐生成漫畫頭像
          用Python實(shí)現(xiàn)Instagram濾鏡,變成百變女神!
          有點(diǎn)玄乎!用Python分析《隱秘的角落》里微表情



          推薦閱讀:

          入門: 最全的零基礎(chǔ)學(xué)Python的問(wèn)題  | 零基礎(chǔ)學(xué)了8個(gè)月的Python  | 實(shí)戰(zhàn)項(xiàng)目 |學(xué)Python就是這條捷徑


          干貨:爬取豆瓣短評(píng),電影《后來(lái)的我們》 | 38年NBA最佳球員分析 |   從萬(wàn)眾期待到口碑撲街!唐探3令人失望  | 笑看新倚天屠龍記 | 燈謎答題王 |用Python做個(gè)海量小姐姐素描圖 |碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影


          趣味:彈球游戲  | 九宮格  | 漂亮的花 | 兩百行Python《天天酷跑》游戲!


          AI: 會(huì)做詩(shī)的機(jī)器人 | 給圖片上色 | 預(yù)測(cè)收入 | 碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影


          小工具: Pdf轉(zhuǎn)Word,輕松搞定表格和水??! | 一鍵把html網(wǎng)頁(yè)保存為pdf!|  再見PDF提取收費(fèi)! | 用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換 | 制作一款釘釘?shù)蛢r(jià)機(jī)票提示器! |60行代碼做了一個(gè)語(yǔ)音壁紙切換器天天看小姐姐!

          點(diǎn)閱讀原文,領(lǐng)優(yōu)惠券

          瀏覽 60
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  日皮网站在线观看 | 美女操逼免费网站 | 影音先锋成人无码影院 | 成人毛片A片免费看 | 91爱爱电影 |