您好,登錄后才能下訂單哦!
這篇文章主要介紹Pandas0.25有什么新功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
從 0.25 起,pandas 只支持 Python 3.53 及以上版本了,不再支持 Python 2.7,還在使用 Python 2 的朋友可要注意了,享受不了新功能了,不過(guò),貌似用 Python 2 做數(shù)據(jù)分析這事兒估計(jì)已經(jīng)絕跡了吧!
下一版 pandas 將只支持 Python 3.6 及以上版本了,這是因?yàn)?f-strings 的緣故嗎?嘿嘿。
徹底去掉了 Panel,N 維數(shù)據(jù)結(jié)構(gòu)以后要用 xarray 了。說(shuō)起來(lái)慚愧,呆鳥(niǎo)還沒(méi)用過(guò) Panel 呢,它怎么就走了。。。。
read_pickle() 與 read_msgpack()
,只向后兼容到 0.20.3。上一篇文章剛介紹過(guò) read_pickle()
,它就也要離我們而去了嗎?-_-||
看完了這四大警告,咱們?cè)倏聪?0.25 帶來(lái)了哪些新東西。
1. Groupby 的 命名聚合(Named Aggregation)
這可是個(gè)新功能,能直接為指定的聚合輸出列命名。先創(chuàng)建一個(gè) DataFrame 示例。
animals = pd.DataFrame({ '品種' : [ '貓' , '狗' , '貓' , '狗' ], '身高' : [ 9.1 , 6.0 , 9.5 , 34.0 ], '體重' : [ 7.9 , 7.5 , 9.9 , 198.0 ]})
animals
命名聚合示例,居然還支持中文誒!不過(guò),這里是為了演示清晰才寫(xiě)的中文變量名,平時(shí),該用英文還是要用英文的。
animals.groupby( '品種' ).agg( 最低=pd.NamedAgg(column= '身高' , aggfunc= 'min' ), 最高=pd.NamedAgg(column= '身高' , aggfunc= 'max' ), 平均體重=pd.NamedAgg(column= '體重' , aggfunc=np.mean), )
這么寫(xiě)看起來(lái)還是有些繁瑣,很不 Pythonic,好在 pandas 提供了更簡(jiǎn)單的寫(xiě)法,只需傳遞一個(gè) Tuple 就可以了,Tuple 里的第一個(gè)元素是指定列,第二個(gè)元素是聚合函數(shù),看看下面的代碼,是不是少敲了好多下鍵盤(pán):
animals.groupby( '品種' ).agg( 最低=( '身高' , min), 最高=( '身高' , max), 平均體重=( '體重' , np.mean), )
這里還可以進(jìn)一步偷懶,只寫(xiě) min
或 max
,連單引號(hào)都不寫(xiě)了。
Pandas 提供了一種叫 pandas.NameAgg
的命名元組( namedtuple ),但如上面的代碼所示,直接使用 Tuple 也沒(méi)問(wèn)題。
這兩段代碼的效果是一樣的,結(jié)果都如下圖所示。
命名聚合取代了已經(jīng)廢棄的 dict-of-dicts
重命名方式,看了一下,之前的操作還真是挺復(fù)雜的,這里就不贅述了,有興趣回顧的朋友,可以自己看下 用 dict 重命名 groupby.agg() 輸出結(jié)果(已廢棄) 這部分內(nèi)容。
命名聚合還支持 Series 的 groupby 對(duì)象,因?yàn)?Series 無(wú)需指定列名,只要寫(xiě)清楚要應(yīng)用的函數(shù)就可以了。
animals.groupby( '品種' ).身高.agg( 最低=min, 最高=max, )
更多有關(guān) 命名聚合 的介紹,詳見(jiàn)官方文檔 Named aggregation 。
2. Groupby 聚合支持多個(gè) lambda 函數(shù)
0.25 版有一個(gè)黑科技,以 list 方式向 agg()
函數(shù)傳遞多個(gè) lambda 函數(shù)。為了減少鍵盤(pán)敲擊量,真是無(wú)所不用其極?。?/p>
animals.groupby( '品種' ).身高.agg([ lambda x: x.iloc[ 0 ], lambda x: x.iloc[ -1 ] ])
animals.groupby( '品種' ).agg([ lambda x: x.iloc[ 0 ] - x.iloc[ 1 ], lambda x: x.iloc[ 0 ] + x.iloc[ 1 ] ])
0.25 版前,這樣操作會(huì)觸發(fā) SpecificationError
。
觸發(fā) SpecificationError
這個(gè)功能也有個(gè)小遺憾,多 lambda 函數(shù)的輸出沒(méi)有像命名聚合那樣可以自定義命名,還要后面手動(dòng)修改,有些不方便,不知道是我沒(méi)找到,還是真沒(méi)有……
3. 優(yōu)化了 MultiIndex 顯示輸出
MultiIndex
輸出的每行數(shù)據(jù)以 Tuple 顯示,且垂直對(duì)齊,這樣一來(lái), MultiIndex
的結(jié)構(gòu)顯示的更清晰了。
pd.MultiIndex.from_product([[ 'a' , 'abc' ], range( 500 )])
之前,是這樣的
現(xiàn)在,是這樣的
真是貨比貨得扔,以前沒(méi)感覺(jué),現(xiàn)在一比較,有沒(méi)有覺(jué)得大不相同呢?
4. 精簡(jiǎn)顯示 Series 與 DataFrame
超過(guò) 60 行的 Series 與 DataFrame,pandas 會(huì)默認(rèn)最多只顯示 60 行(見(jiàn) display.max_rows
選項(xiàng))。這種設(shè)置依然會(huì)占用大量垂直屏幕空間。因此,0.25 版引入了 display.min_rows
選項(xiàng),默認(rèn)只顯示 10 行:
數(shù)據(jù)量小的 Series 與 DataFrame, 顯示 max_row
行數(shù)據(jù),默認(rèn)為 60 行,前 30 行與后 30 行; 數(shù)據(jù)量大的 Series 與 DataFrame,如果數(shù)據(jù)量超過(guò) max_rows
, 只顯示 min_rows
行,默認(rèn)為 10 行,即前 5 行與后 5 行。
最大與最小行數(shù)這種雙重選項(xiàng),允許在數(shù)據(jù)量較小時(shí),比如數(shù)據(jù)量少于 60 行,顯示全部數(shù)據(jù),在數(shù)據(jù)量較大時(shí),則只顯示數(shù)據(jù)摘要。
要去掉 min_rows
的設(shè)置,可以把該選項(xiàng)設(shè)置為 None
:
pd.options.display.min_rows = None
sales_date1 = pd.date_range( '20190101' , periods=1000, freq= 'D' ) amount1 = np.arange(1000) cols = [ '銷售金額' ] sales1 = pd.DataFrame(amount1,index=sales_date1,columns=cols)
min_rows
在 VSCode 里顯示正常,只顯示了前 5 行與后 5 行,但貌似 Jupyter Notebook 6.0 目前貌似還不支持這個(gè)設(shè)置,還是顯示前 30 行與后 30 行。圖片太長(zhǎng),這里就不截圖了。如果 Jupyter 可以的話,請(qǐng)告訴我。
5. json_normalize() 支持 max_level
json_normalize() 支持按層級(jí)(level)讀取,增加了 max_level
控制參數(shù)。
from pandas.io.json import json_normalize data = [{ 'CreatedBy' : { 'Name' : 'User001' }, 'Lookup' : { 'TextField' : 'Some text' , 'UserField' : { 'Id' : 'ID001' , 'Name' : 'Name001' }}, 'Image' : { 'a' : 'b' } }]
0.25 以前是這樣的,所有層級(jí)都讀取出來(lái)了:
json_normalize(data)
0.25 以后是這樣的,可以通過(guò) max_level
參數(shù)控制讀取的 JSON 數(shù)據(jù)層級(jí):
json_normalize(data, max_level= 1 )
6. 增加 explode() 方法,把 list “炸 ” 成行
Series 與 DataFrame 增加了 explode() 方法,把 list 形式的值轉(zhuǎn)換為單獨(dú)的行。
df = pd.DataFrame([{ '變量1' : 'a,b,c' , '變量2' : 1 }, { '變量1' : 'd,e,f' , '變量2' : 2 }])
df
df.assign(變量 1 =df.變量 1. str.split( ',' )).explode( '變量1' )
以后再拆分這樣的數(shù)據(jù)就簡(jiǎn)單多了。具體官方文檔說(shuō)明詳見(jiàn) section on Exploding list-like column 。
7. SparseDataFrame 被廢棄了
0.25 以前專門(mén)有 SparseDataFrame()
,生成稀疏矩陣,0.25 以后,這個(gè)函數(shù)被廢棄了,改成 pd.DataFrame
里的 pd.SparseArray()
了,函數(shù)統(tǒng)一了,但是要多敲幾下鍵盤(pán)了。
0.25 以前是這樣的:
pd.SparseDataFrame({ "A" : [0, 1]})
0.25 以后是這樣的:
pd.DataFrame({ "A" : pd.SparseArray([0, 1])})
輸出的結(jié)果都是一樣的:
8. 對(duì) DataFrame Groupby 后,Groupby.apply 對(duì)每組只處理一次
df = pd.DataFrame({ "a" : [ "x" , "y" ], "b" : [ 1 , 2 ]}) df def func (group) : print(group.name) return group df.groupby( 'a' ).apply(func)
有沒(méi)有想到,0.25 以前輸出的結(jié)果居然是這樣的:
0.25以前
0.25以后
這樣才正常嘛~~!
9. 用 Dict 生成的 DataFrame,終于支持列排序啦
data = [ { '姓 名' : '張三' , '城 市' : '北京' , '年 齡' : 18 }, { '姓 名' : '李四' , '城 市' : '上海' , '年 齡' : 19 , '愛(ài) 好' : '打游戲' }, { '姓 名' : '王五' , '城 市' : '廣州' , '年 齡' : 20 , '財(cái)務(wù)狀況' : '優(yōu)' } ] pd.DataFrame(data)
以前是亂序的,全憑 pandas 的喜好:
現(xiàn)在,我的字典終于我做主了!
10. Query() 支持列名空格了
用上面的 data
生成一個(gè)示例 DataFrame,注意列名是有空格的。
df = pd.DataFrame(data)
現(xiàn)在用反引號(hào)(`)括住列名,就可以直接查詢了:
df.query( '`年 齡` <19' )
好了,本文就先介紹 pandas 0.25 的這些改變,其實(shí),0.25 還包括了很多優(yōu)化,比如,對(duì) DataFrame GroupBy 后 ffill
, bfill
方法的調(diào)整,對(duì)類別型數(shù)據(jù)的 argsort
的缺失值排序, groupby
保留類別數(shù)據(jù)的數(shù)據(jù)類型等,如需了解,詳見(jiàn)官方文檔 What's new in 0.25.0 。
以上是“Pandas0.25有什么新功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。