天天看點

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能
呆鳥雲:“7 月 18 日,Pandas 團隊推出了 Pandas 0.25 版,這就相當于 Python 3.8 啦,Python 資料分析師可别錯過新版的好功能哦。”

安裝 0.25 版:

pip install pandas

,就可以了。

下面和大家一起看看新版 pandas 都有哪些改變。

一、四個置頂的警告!

  1. 從 0.25 起,pandas 隻支援 Python 3.53 及以上版本了,不再支援 Python 2.7,還在使用 Python 2 的朋友可要注意了,享受不了新功能了,不過,貌似用 Python 2 做資料分析這事兒估計已經絕迹了吧!
Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能
  1. 下一版 pandas 将隻支援 Python 3.6 及以上版本了,這是因為 f-strings 的緣故嗎?嘿嘿。
Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能
  1. 徹底去掉了 Panel,N 維資料結構以後要用 xarray 了。說起來慚愧,呆鳥還沒用過 Panel 呢,它怎麼就走了。。。。
Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能
  1. read_pickle()

    read_msgpack()

    ,隻向後相容到 0.20.3。上一篇文章剛介紹過

    read_pickle()

    ,它就也要離我們而去了嗎?-_-||

看完了這四大警告,咱們再看下 0.25 帶來了哪些新東西。

二、新增功能

1. Groupby 的命名聚合(Named Aggregation)

這可是個新功能,能直接為指定的聚合輸出列命名。先建立一個 DataFrame 示例。

animals = pd.DataFrame({'品種': ['貓', '狗', '貓', '狗'],                                                '身高': [9.1, 6.0, 9.5, 34.0],                                              '體重': [7.9, 7.5, 9.9, 198.0]})
animals           

複制

命名聚合示例,居然還支援中文诶!不過,這裡是為了示範清晰才寫的中文變量名,平時,該用英文還是要用英文的。
animals.groupby('品種').agg(
    最低=pd.NamedAgg(column='身高', aggfunc='min'),
    最高=pd.NamedAgg(column='身高', aggfunc='max'),
    平均體重=pd.NamedAgg(column='體重', aggfunc=np.mean),
)           

複制

這麼寫看起來還是有些繁瑣,很不 Pythonic,好在 pandas 提供了更簡單的寫法,隻需傳遞一個 Tuple 就可以了,Tuple 裡的第一個元素是指定列,第二個元素是聚合函數,看看下面的代碼,是不是少敲了好多下鍵盤:

animals.groupby('品種').agg(
    最低=('身高', min),
    最高=('身高', max),
    平均體重=('體重', np.mean),
)           

複制

這裡還可以進一步偷懶,隻寫

min

max

,連單引号都不寫了。

Pandas 提供了一種叫

pandas.NameAgg

的命名元組(namedtuple),但如上面的代碼所示,直接使用 Tuple 也沒問題。

這兩段代碼的效果是一樣的,結果都如下圖所示。

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

命名聚合取代了已經廢棄的

dict-of-dicts

重命名方式,看了一下,之前的操作還真是挺複雜的,這裡就不贅述了,有興趣回顧的朋友,可以自己看下用 dict 重命名 groupby.agg() 輸出結果(已廢棄) 這部分内容。

命名聚合還支援 Series 的 groupby 對象,因為 Series 無需指定列名,隻要寫清楚要應用的函數就可以了。

animals.groupby('品種').身高.agg(
    最低=min,
    最高=max,
)           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

更多有關命名聚合的介紹,詳見官方文檔 Named aggregation 。

2. Groupby 聚合支援多個 lambda 函數

0.25 版有一個黑科技,以 list 方式向

agg()

函數傳遞多個 lambda 函數。為了減少鍵盤敲擊量,真是無所不用其極啊!

animals.groupby('品種').身高.agg([        lambda x: x.iloc[0], lambda x: x.iloc[-1]
])           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能
animals.groupby('品種').agg([    lambda x: x.iloc[0] - x.iloc[1],    lambda x: x.iloc[0] + x.iloc[1]
])           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

0.25 版前,這樣操作會觸發

SpecificationError

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

觸發 SpecificationError

這個功能也有個小遺憾,多 lambda 函數的輸出沒有像命名聚合那樣可以自定義命名,還要後面手動修改,有些不友善,不知道是我沒找到,還是真沒有……

3. 優化了 MultiIndex 顯示輸出

MultiIndex

輸出的每行資料以 Tuple 顯示,且垂直對齊,這樣一來,

MultiIndex

的結構顯示的更清晰了。

pd.MultiIndex.from_product([['a', 'abc'], range(500)])           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

之前,是這樣的

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

現在,是這樣的

真是貨比貨得扔,以前沒感覺,現在一比較,有沒有覺得大不相同呢?

4. 精簡顯示 Series 與 DataFrame

超過 60 行的 Series 與 DataFrame,pandas 會預設最多隻顯示 60 行(見

display.max_rows

選項)。這種設定依然會占用大量垂直螢幕空間。是以,0.25 版引入了

display.min_rows

選項,預設隻顯示 10 行:

  • 資料量小的 Series 與 DataFrame, 顯示

    max_row

    行資料,預設為 60 行,前 30 行與後 30 行;
  • 資料量大的 Series 與 DataFrame,如果資料量超過

    max_rows

    , 隻顯示

    min_rows

    行,預設為 10 行,即前 5 行與後 5 行。

最大與最小行數這種雙重選項,允許在資料量較小時,比如資料量少于 60 行,顯示全部資料,在資料量較大時,則隻顯示資料摘要。

要去掉

min_rows

的設定,可以把該選項設定為

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)           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

min_rows

在 VSCode 裡顯示正常,隻顯示了前 5 行與後 5 行,但貌似 Jupyter Notebook 6.0 目前貌似還不支援這個設定,還是顯示前 30 行與後 30 行。圖檔太長,這裡就不截圖了。如果 Jupyter 可以的話,請告訴我。

5. json_normalize() 支援 max_level

json_normalize() 支援按層級(level)讀取,增加了

max_level

控制參數。

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 以前是這樣的,所有層級都讀取出來了:

json_normalize(data)           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

0.25 以後是這樣的,可以通過

max_level

參數控制讀取的 JSON 資料層級:

json_normalize(data, max_level=1)           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

6. 增加 explode() 方法,把 list “炸”成行

Series 與 DataFrame 增加了 explode() 方法,把 list 形式的值轉換為單獨的行。

df = pd.DataFrame([{'變量1': 'a,b,c', '變量2': 1},
                   {'變量1': 'd,e,f', '變量2': 2}])
df           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能
df.assign(變量1=df.變量1.str.split(',')).explode('變量1')           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

以後再拆分這樣的資料就簡單多了。具體官方文檔說明詳見 section on Exploding list-like column。

7. SparseDataFrame 被廢棄了

0.25 以前專門有

SparseDataFrame()

,生成稀疏矩陣,0.25 以後,這個函數被廢棄了,改成

pd.DataFrame

裡的

pd.SparseArray()

了,函數統一了,但是要多敲幾下鍵盤了。

0.25 以前是這樣的:

pd.SparseDataFrame({"A": [0, 1]})           

複制

0.25 以後是這樣的:

pd.DataFrame({"A": pd.SparseArray([0, 1])})           

複制

輸出的結果都是一樣的:

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

8. 對 DataFrame Groupby 後,Groupby.apply 對每組隻處理一次

df = pd.DataFrame({"a": ["x", "y"], "b": [1, 2]})
dfdef func(group):
    print(group.name)    return group

df.groupby('a').apply(func)           

複制

有沒有想到,0.25 以前輸出的結果居然是這樣的:

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

0.25以前

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

0.25以後

這樣才正常嘛~~!

9. 用 Dict 生成的 DataFrame,終于支援列排序啦

data = [
    {'姓 名': '張三', '城 市': '北京', '年 齡': 18},
    {'姓 名': '李四', '城 市': '上海', '年 齡': 19, '愛 好': '打遊戲'},
    {'姓 名': '王五', '城 市': '廣州', '年 齡': 20, '财務狀況': '優'}
]
pd.DataFrame(data)           

複制

以前是亂序的,全憑 pandas 的喜好:

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

現在,我的字典終于我做主了!

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

10. Query() 支援列名空格了

用上面的

data

生成一個示例 DataFrame,注意列名是有空格的。

df = pd.DataFrame(data)           

複制

現在用反引号(`)包覆列名,就可以直接查詢了:

df.query('`年 齡` <19')           

複制

Pandas0.25來了,别錯過這10大好用的新功能一、四個置頂的警告!二、新增功能

好了,本文就先介紹 pandas 0.25 的這些改變,其實,0.25 還包括了很多優化,比如,對 DataFrame GroupBy 後

ffill

,

bfill

方法的調整,對類别型資料的

argsort

的缺失值排序,

groupby

保留類别資料的資料類型等,如需了解,詳見官方文檔 What's new in 0.25.0。

配套的 Jupyter Notebook 檔案連結:

https://github.com/jaystone776/pandas_answered/blob/master/10_New_Features_in_Pandas_0.25.ipynb。