小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

30KB的數(shù)據(jù)集縮小至2KB僅用2步完成 | 25個(gè)Pandas實(shí)用技巧(上)

 F2967527 2020-04-11

文末領(lǐng)取【示例數(shù)據(jù)集+代碼過(guò)程】

本文一共為大家分享25個(gè)pandas技巧,分為兩篇分享給大家。首先我們需要先提前下載好示例數(shù)據(jù)集,小編已經(jīng)幫大家整理好了,文末添加客服即可領(lǐng)取。

利用以下代碼導(dǎo)入上述數(shù)據(jù)集:

In [1]:import pandas as pdimport numpy as np
In [6]:drinks = pd.read_csv('http:///drinksbycountry')movies = pd.read_csv('http:///imdbratings')orders = pd.read_csv('http:///chiporders', sep='\t')orders['item_price'] = orders.item_price.str.replace('$', '').astype('float')stocks = pd.read_csv('http:///smallstocks', parse_dates=['Date'])titanic = pd.read_csv('http:///kaggletrain')ufo = pd.read_csv('http:///uforeports', parse_dates=['Time'])

顯示已安裝的版本

輸入下面的命令查詢(xún)pandas版本:

In [7]:pd.__version__Out[7]:'0.24.2'

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

In [9]:pd.show_versions()
INSTALLED VERSIONS ------------------ commit: None python: 3.7.3.final.0 python-bits: 64 OS: Darwin OS-release: 18.6.0 machine: x86_64 processor: i386 byteorder: little LC_ALL: None LANG: en_US.UTF-8 LOCALE: en_US.UTF-8
pandas: 0.24.2 pytest: None pip: 19.1.1 setuptools: 41.0.1 Cython: None numpy: 1.16.4 scipy: None pyarrow: None xarray: None IPython: 7.5.0 sphinx: None patsy: None dateutil: 2.8.0 pytz: 2019.1 blosc: None bottleneck: None tables: None numexpr: None feather: None matplotlib: 3.1.0 openpyxl: None xlrd: None xlwt: None xlsxwriter: None lxml.etree: None bs4: None html5lib: None sqlalchemy: None pymysql: None psycopg2: None jinja2: 2.10.1 s3fs: None fastparquet: None pandas_gbq: None pandas_datareader: None gcsfs: 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:

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

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


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

In [15]:df.columns = ['col_one''col_two']

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

In [16]:df.columns = df.columns.str.replace(' ''_')

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


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


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

行序反轉(zhuǎn)

讓我們來(lái)看一下drinks這個(gè)DataFame:

In [20]:drinks.head()
Out[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)一致:

In [21]:drinks.loc[::-1].head()
Out[21]:

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


如果你還想重置索引使得它從0開(kāi)始呢?


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

In [22]:drinks.loc[::-1].reset_index(drop=True).head()
Out[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):

In [23]:drinks.loc[:, ::-1].head()
Out[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ù)類(lèi)型選擇列

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

In [24]:drinks.dtypes
Out[24]:country objectbeer_servings int64spirit_servings int64wine_servings int64total_litres_of_pure_alcohol float64continent objectdtype: object

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

In [25]:drinks.select_dtypes(include='number').head()
Out[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ù)類(lèi)型為object的列:


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


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

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

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


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


為了對(duì)這些列進(jìn)行數(shù)學(xué)運(yùn)算,我們需要將數(shù)據(jù)類(lèi)型轉(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ù)類(lèi)型都轉(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í)際上為類(lèi)別變量的object列轉(zhuǎn)換成類(lèi)別變量,可以調(diào)用dtypes參數(shù):


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


值得注意的是,如果跟行數(shù)相比,category數(shù)據(jù)類(lèi)型的列數(shù)相對(duì)較小,那么catefory數(shù)據(jù)類(lèi)型可以減小內(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開(kāi)頭的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ù)開(kāi)始。這一次,我們需要告訴concat()函數(shù)按列來(lái)組合:


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

End.

譯者:山陰少年

來(lái)源:博客園

原文鏈接:https://nbviewer./github/justmarkham/pandas-videos/blob/master/top_25_pandas_tricks.ipynb

本文為轉(zhuǎn)載,如有侵權(quán)請(qǐng)聯(lián)系后臺(tái)刪除

愛(ài)數(shù)據(jù)學(xué)院每周免費(fèi)直播課


本次直播主題:

 2020年第1季度城市崗位報(bào)告

【深圳、廣州、上海、杭州、北京】

 直播內(nèi)容:

  • 5大熱門(mén)城市崗位情況

  • 典型公司/崗位要求變化和機(jī)會(huì)分析

  • 第2季度招聘趨勢(shì)&行業(yè)風(fēng)險(xiǎn)判斷


直播時(shí)間:
4月11日  今晚20:30

掃描下方海報(bào)二維碼領(lǐng)取【示例數(shù)據(jù)集+代碼過(guò)程】

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多