StatsFragments

Python, R, Rust, 統計, 機械学習とか

pandas 0.17.0 の主要な変更点

先日 10/9 に pandas 0.17.0 がリリースされた。直近のバージョンアップの中では かなり機能追加が多いリリースとなった。

重要な変更は リリースノート にハイライトとして列挙しているのだが、これらはある程度 pandas を使いこなしている方向けの記載となっている。

そのため、ここでは よりライトなユーザ向けに重要と思われる変更を書く。特に、ユーザ側のプログラムに影響がある以下の3点について記載する。

  1. ソート API の統合 ( sort_values / sort_index )
  2. 重複削除 API の改善 ( drop_duplicates / duplicated )
  3. .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 アクセサの追加

DataFrameSeries をプロットする際のグラフの種類が、 .plot.bar().plot.hist() のように .plot をアクセサとして指定できるようになった。

これまでのメソッド呼び出し ( .plot(kind='bar') ) は引き続き利用できる。

df = pd.DataFrame(np.random.randn(5, 10))

# df.plot(kind='box') と同じ
df.plot.box()

f:id:sinhrks:20151017203318p:plain

その他

また、上記ほどではないが重要な内容を列挙する。気になるものがあれば詳細はリンク先で。

  • GIL 解放 ( Dask 利用時のパフォーマンス向上) (詳細)
  • pandas.io.data を deprecate し、別パッケージ pandas-datareader として分離 (詳細)
  • pd.to_datetime のエラー処理の変更、日時パース時の挙動統一 (詳細)
  • Index 同士の比較演算時の一部挙動の変更 (詳細)
  • ターミナル上での日本語データ表示時の位置補正オプションの追加 (詳細)

まとめ

pandas 0.17.0 での特に重要な変更点 3 点を記載した。

  1. ソート API の統合 ( sort_values / sort_index )
  2. 重複削除 API の改善 ( drop_duplicates / duplicated )
  3. .plot アクセサの追加

これら以外の変更点については リリースノート を一読お願いします。

10/18 編集 コメントご指摘により誤記を修正

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理