pandas 0.17.0 の主要な変更点
先日 10/9 に pandas
0.17.0 がリリースされた。直近のバージョンアップの中では かなり機能追加が多いリリースとなった。
重要な変更は リリースノート にハイライトとして列挙しているのだが、これらはある程度 pandas
を使いこなしている方向けの記載となっている。
そのため、ここでは よりライトなユーザ向けに重要と思われる変更を書く。特に、ユーザ側のプログラムに影響がある以下の3点について記載する。
- ソート API の統合 (
sort_values
/sort_index
) - 重複削除 API の改善 (
drop_duplicates
/duplicated
) .plot
アクセサの追加
準備
import numpy as np import pandas as pd np.__version__ # '1.10.1' pd.__version__ # u'0.17.0'
1. ソート API の統合 ( sort_values
/ sort_index
)
これまで一貫性がなかったソート API が以下のように統合された。以前のメソッド / 引数は deprecate されており、将来のバージョン ( 通例では 0.19.0 以降 ) で削除される。
値によるソート ( sort_values
として統合):
0.16.2以前 | 0.17.0以降 |
---|---|
Series.order() |
Series.sort_values() |
Series.sort() |
Series.sort_values(inplace=True) |
DataFrame.sort(columns=...) |
DataFrame.sort_values(by=...) |
ラベル ( Index
) によるソート ( sort_index
として統合):
0.16.2以前 | 0.17.0以降 |
---|---|
Series.sort_index() |
Series.sort_index() |
Series.sortlevel(level=...) |
Series.sort_index(level=...) |
DataFrame.sort_index() |
DataFrame.sort_index() |
DataFrame.sortlevel(level=...) |
DataFrame.sort_index(level=...) |
DataFrame.sort() |
DataFrame.sort_index() |
それぞれ、引数として以下のオプションが利用できる。
inplace
: 破壊的にソートするかどうかを指定する。既定はFalse
(非破壊)axis
: ソートの方向(軸)を指定するascending
: ソート順序 (昇順/降順) を指定する。既定はTrue
(昇順)
s = pd.Series(list('afcedb'), index=[1, 3, 2, 4, 0, 5]) s # 1 a # 3 f # 2 c # 4 e # 0 d # 5 b # dtype: object # 値によるソート s.sort_values() # 1 a # 5 b # 2 c # 0 d # 4 e # 3 f # dtype: object # ラベル (index) によるソート s.sort_index() # 0 d # 1 a # 2 c # 3 f # 4 e # 5 b # dtype: object
補足 もともとの仕様は NumPy
(というか Python) の .sort
メソッドの挙動 ( 破壊的なソート) にあわせたものだった。今回の変更により NumPy
とは差異が発生する。
a = np.array([3, 2, 1]) a # array([3, 2, 1]) a.sort() a # array([1, 2, 3])
2. 重複削除 API の改善 ( drop_duplicates
/ duplicated
)
重複した値の削除を行う drop_duplicates
で、重複値の全削除ができるようになった。
0.16.2以前 | 0.17.0以降 |
---|---|
.drop_duplicates() |
.drop_duplicates() |
.drop_duplicates(take_last=True) |
.drop_duplicates(keep='last') |
- | .drop_duplicates(keep=False) |
削除方法の指定は これまでの take_last
から keep
オプション に変更された。
s = pd.Series(list('abebdcd')) s # 0 a # 1 b # 2 e # 3 b # 4 d # 5 c # 6 d # dtype: object # 重複がある場合、最初に出現した値を残す s.drop_duplicates() # 0 a # 1 b # 2 e # 4 d # 5 c # dtype: object # 重複がある場合、最後に出現した値を残す s.drop_duplicates(keep='last') # 0 a # 2 e # 3 b # 5 c # 6 d # dtype: object # 重複した値を残さない s.drop_duplicates(keep=False) # 0 a # 2 e # 5 c # dtype: object
また、値が重複しているかどうかを調べる .duplicated
でも keep
オプションが利用できる。
# 重複がある場合、最初に出現した値以外を True s.duplicated() # 0 False # 1 False # 2 False # 3 True # 4 False # 5 False # 6 True # dtype: bool # 重複がある場合、最後に出現した値以外を True s.duplicated(keep='last') # 0 False # 1 True # 2 False # 3 False # 4 True # 5 False # 6 False # dtype: bool # 重複 全てを True s.duplicated(keep=False) # 0 False # 1 True # 2 False # 3 True # 4 True # 5 False # 6 True # dtype: bool
Index
の値から重複を全削除する場合は Index.duplicated
を以下のように利用すればよい。
s = pd.Series(np.arange(6), index=list('abcbda')) s # a 0 # b 1 # c 2 # b 3 # d 4 # a 5 # dtype: int64 s[~s.index.duplicated(keep=False)] # c 2 # d 4 # dtype: int64
3. .plot
アクセサの追加
DataFrame
や Series
をプロットする際のグラフの種類が、 .plot.bar()
や .plot.hist()
のように .plot
をアクセサとして指定できるようになった。
これまでのメソッド呼び出し ( .plot(kind='bar')
) は引き続き利用できる。
df = pd.DataFrame(np.random.randn(5, 10)) # df.plot(kind='box') と同じ df.plot.box()
その他
また、上記ほどではないが重要な内容を列挙する。気になるものがあれば詳細はリンク先で。
- GIL 解放 (
Dask
利用時のパフォーマンス向上) (詳細) pandas.io.data
を deprecate し、別パッケージpandas-datareader
として分離 (詳細)pd.to_datetime
のエラー処理の変更、日時パース時の挙動統一 (詳細)Index
同士の比較演算時の一部挙動の変更 (詳細)- ターミナル上での日本語データ表示時の位置補正オプションの追加 (詳細)
まとめ
pandas
0.17.0 での特に重要な変更点 3 点を記載した。
- ソート API の統合 (
sort_values
/sort_index
) - 重複削除 API の改善 (
drop_duplicates
/duplicated
) .plot
アクセサの追加
これら以外の変更点については リリースノート を一読お願いします。
10/18 編集 コメントご指摘により誤記を修正
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,小林儀匡,鈴木宏尚,瀬戸山雅人,滝口開資,野上大介
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
- メディア: 大型本
- この商品を含むブログ (11件) を見る