1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5637字,需瀏覽 12分鐘

         ·

        2020-08-12 15:52






        (給機(jī)器學(xué)習(xí)算法與Python實戰(zhàn)加星標(biāo),提升AI技能)


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

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

        本文一共為大家分享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


        假設(shè)你需要創(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ù)值型的,你可以強(qiáng)制地將一串字符賦值給columns參數(shù)




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


        更改列名


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




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


        更改列名最靈活的方式是使用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ù)的結(jié)果都一樣,可以更改列名使得列名中不含有空格:




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




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



        行序反轉(zhuǎn)


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

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

        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ù)序號。


        列序反轉(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


        逗號之前的冒號表示選擇所有行,逗號之后的::-1表示反轉(zhuǎn)所有的列,這就是為什么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è)你僅僅需要選取數(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ù)類型:



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

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




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




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




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

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




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




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




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



        減小DataFrame空間大小


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


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




        可以看到它使用了30.4KB。


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


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




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


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




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


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


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

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


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




        這是第二天的:




        這是第三天的:




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


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




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


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




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



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


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


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




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




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

        如果看到這里,說明你喜歡這篇文章,請轉(zhuǎn)發(fā)、點贊。微信搜索「hych666」,歡迎添加我的微信,更多精彩,盡在我的朋友圈。
        掃描二維碼添加好友↓

        推薦閱讀

        (點擊標(biāo)題可跳轉(zhuǎn)閱讀)

        遷移學(xué)習(xí):邁向真正的人工智能

        玩機(jī)器學(xué)習(xí),再也不缺數(shù)據(jù)集了

        集成學(xué)習(xí):一種先進(jìn)的機(jī)器學(xué)習(xí)方法

        NumPy庫入門教程:基礎(chǔ)知識總結(jié)

        人工智能最全學(xué)習(xí)路線!8大板塊,36本書,趕緊上車!

        23個Python爬蟲開源項目代碼:爬取微信、淘寶、豆瓣、知乎、微博等


        老鐵,三連支持一下,好嗎?↓↓↓

        瀏覽 42
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            骚妇视频欧美一区二区 | 国产黄色视频在线观看 | 91在线无码精品秘 入口九色十 | www人人操com 偷拍一页 | 后入美女逼 | 日本三级电影在线播放 | 成年美女黄网站色大免费看 | 污污视频网址 | 国产精品久久久久久久午夜 | 欧美在线观看禁18 |