バージョン 0.7.0 (2012年2月9日)#

新機能#

  • データベース/リレーショナル代数操作の全領域を効率的に実行するための新しい統合されたマージ関数。既存の結合メソッドを新しいインフラストラクチャを使用するようにリファクタリングし、大幅なパフォーマンス向上を実現しました (GH 220, GH 249, GH 267)

  • 軸に沿ってSeries、DataFrame、またはPanelオブジェクトを連結するための新しい統合連結関数。他の軸の和集合または交差集合を形成できます。Series.append および DataFrame.append のパフォーマンスを向上させます (GH 468, GH 479, GH 273)

  • DataFrame.append に複数のDataFrameを渡して連結(スタック)したり、Series.append に複数のSeriesを渡したりできるようになりました

  • DataFrameコンストラクタに辞書のリスト(例:JSONオブジェクトのリスト)を渡せるようになりました (GH 526)

  • __getitem__ を介してDataFrameの複数の列を設定できるようになり、変換に便利です (GH 342)

  • DataFrame.apply におけるインデックスが異なる出力値の処理 (GH 498)

In [1]: df = pd.DataFrame(np.random.randn(10, 4))
In [2]: df.apply(lambda x: x.describe())
Out[2]:
               0          1          2          3
count  10.000000  10.000000  10.000000  10.000000
mean    0.190912  -0.395125  -0.731920  -0.403130
std     0.730951   0.813266   1.112016   0.961912
min    -0.861849  -2.104569  -1.776904  -1.469388
25%    -0.411391  -0.698728  -1.501401  -1.076610
50%     0.380863  -0.228039  -1.191943  -1.004091
75%     0.658444   0.057974  -0.034326   0.461706
max     1.212112   0.577046   1.643563   1.071804

[8 rows x 4 columns]
  • SeriesおよびDataFrameにreorder_levels メソッドを追加 (GH 534)

  • DataFrameおよびPanelに辞書ライクなget 関数を追加 (GH 521)

  • DataFrameの行を効率的に反復処理するためのDataFrame.iterrows メソッドを追加

  • LongPanel.to_long から適合されたコードで DataFrame.to_panel を追加

  • DataFrameにreindex_axis メソッドを追加

  • DataFrame および Series の二項算術関数に level オプションを追加

  • SeriesおよびDataFrameのreindex および align メソッドにlevel オプションを追加し、レベル全体に値をブロードキャストできるようにしました (GH 542, GH 552, その他)

  • Panel への属性ベースのアイテムアクセスとIPython補完を追加 (GH 563)

  • Series.plotlogy オプションを追加し、Y軸のログスケールを可能にしました

  • DataFrame.to_stringindex および header オプションを追加

  • インデックスで結合するためにDataFrame.join に複数のDataFrameを渡せるようになりました (GH 115)

  • Panel.join に複数のPanelを渡せるようになりました (GH 115)

  • DataFrame.to_stringjustify 引数を追加し、列ヘッダーの異なる配置を可能にしました

  • GroupByに sort オプションを追加し、グループキーのソートを無効にして速度向上を可能にしました (GH 595)

  • SeriesコンストラクタにMaskedArrayを渡せるようになりました (GH 563)

  • 属性によるPanelアイテムアクセスとIPython補完を追加 (GH 554)

  • 行と列のラベルのシーケンスが与えられた値を取得するための、ファンシーインデックスのアナログである DataFrame.lookup を実装しました (GH 338)

  • DataFrameのgroupbyで集計するために関数のリストを渡すことができ、階層的な列を持つ集計結果が生成されます (GH 166)

  • SeriesおよびDataFrameで cummin および cummax を呼び出して、それぞれ累積最小値および最大値を取得できるようになりました (GH 647)

  • データフレームの最小値と最大値を取得するためのユーティリティ関数としてvalue_rangeが追加されました (GH 288)

  • 非ASCIIテキスト用に read_csvread_tableto_csv、および from_csvencoding 引数を追加しました (GH 717)

  • pandasオブジェクトにabs メソッドを追加

  • 頻度表を簡単に計算するための crosstab 関数を追加

  • インデックスオブジェクトにisin メソッドを追加

  • DataFrameのxs メソッドに level 引数を追加

整数インデックスのAPI変更#

0.7.0における潜在的に最もリスクの高いAPI変更の1つであり、同時に最も重要な変更の1つは、ラベルベースのインデックスに関する整数インデックスの処理方法の完全な見直しでした。以下に例を示します。

In [3]: s = pd.Series(np.random.randn(10), index=range(0, 20, 2))
In [4]: s
Out[4]:
0    -1.294524
2     0.413738
4     0.276662
6    -0.472035
8    -0.013960
10   -0.362543
12   -0.006154
14   -0.923061
16    0.895717
18    0.805244
Length: 10, dtype: float64

In [5]: s[0]
Out[5]: -1.2945235902555294

In [6]: s[2]
Out[6]: 0.41373810535784006

In [7]: s[4]
Out[7]: 0.2766617129497566

これはすべて以前の動作とまったく同じです。しかし、Seriesに含まれていないキーを要求した場合、バージョン0.6.1以前では、Seriesは位置ベースのルックアップにフォールバックしていました。これは現在 KeyError を発生させます。

In [2]: s[1]
KeyError: 1

この変更はDataFrameにも同じ影響を与えます。

In [3]: df = pd.DataFrame(np.random.randn(8, 4), index=range(0, 16, 2))

In [4]: df
    0        1       2       3
0   0.88427  0.3363 -0.1787  0.03162
2   0.14451 -0.1415  0.2504  0.58374
4  -1.44779 -0.9186 -1.4996  0.27163
6  -0.26598 -2.4184 -0.2658  0.11503
8  -0.58776  0.3144 -0.8566  0.61941
10  0.10940 -0.7175 -1.0108  0.47990
12 -1.16919 -0.3087 -0.6049 -0.43544
14 -0.07337  0.3410  0.0424 -0.16037

In [5]: df.ix[3]
KeyError: 3

純粋な整数ベースのインデックスをサポートするために、以下のメソッドが追加されました。

メソッド

説明

Series.iget_value(i)

位置 i に格納されている値を取得します。

Series.iget(i)

iget_value のエイリアス

DataFrame.irow(i)

i 番目の行を取得します。

DataFrame.icol(j)

j 番目の列を取得します。

DataFrame.iget_value(i, j)

i と列 j の値を取得します。

ラベルベースのスライスに関するAPIの調整#

ix を使用したラベルベースのスライスは、開始点と終了点の両方がインデックスに含まれていない限り、インデックスがソートされている(単調である)ことを要求するようになりました。

In [1]: s = pd.Series(np.random.randn(6), index=list('gmkaec'))

In [2]: s
Out[2]:
g   -1.182230
m   -0.276183
k   -0.243550
a    1.628992
e    0.073308
c   -0.539890
dtype: float64

これは問題ありません。

In [3]: s.ix['k':'e']
Out[3]:
k   -0.243550
a    1.628992
e    0.073308
dtype: float64

しかし、これはそうではありません。

In [12]: s.ix['b':'h']
KeyError 'b'

インデックスがソートされていれば、「範囲選択」が可能だったでしょう。

In [4]: s2 = s.sort_index()

In [5]: s2
Out[5]:
a    1.628992
c   -0.539890
e    0.073308
g   -1.182230
k   -0.243550
m   -0.276183
dtype: float64

In [6]: s2.ix['b':'h']
Out[6]:
c   -0.539890
e    0.073308
g   -1.182230
dtype: float64

Series [] 演算子の変更#

表記上の便宜として、[] (つまり __getitem____setitem__ メソッド)を介して値を取得および設定する際に、Seriesにラベルのシーケンスまたはラベルスライスを渡すことができます。動作は、整数インデックスの場合を除きix に同様の入力を渡す場合と同じになります。

In [8]: s = pd.Series(np.random.randn(6), index=list('acegkm'))

In [9]: s
Out[9]:
a   -1.206412
c    2.565646
e    1.431256
g    1.340309
k   -1.170299
m   -0.226169
Length: 6, dtype: float64

In [10]: s[['m', 'a', 'c', 'e']]
Out[10]:
m   -0.226169
a   -1.206412
c    2.565646
e    1.431256
Length: 4, dtype: float64

In [11]: s['b':'l']
Out[11]:
c    2.565646
e    1.431256
g    1.340309
k   -1.170299
Length: 4, dtype: float64

In [12]: s['c':'k']
Out[12]:
c    2.565646
e    1.431256
g    1.340309
k   -1.170299
Length: 4, dtype: float64

整数インデックスの場合、動作は以前とまったく同じになります(ndarray をシャドウイング)。

In [13]: s = pd.Series(np.random.randn(6), index=range(0, 12, 2))

In [14]: s[[4, 0, 2]]
Out[14]:
4    0.132003
0    0.410835
2    0.813850
Length: 3, dtype: float64

In [15]: s[1:5]
Out[15]:
2    0.813850
4    0.132003
6   -0.827317
8   -0.076467
Length: 4, dtype: float64

ラベルの意味論を持つ整数インデックスでシーケンスとスライスによるインデックス付けを行いたい場合は、ix を使用してください。

その他の API の変更#

  • 非推奨の LongPanel クラスは完全に削除されました。

  • DataFrameの列に対して Series.sort が呼び出された場合、例外が発生するようになりました。以前は、副作用のない df[col].order() メソッドではなく df[col].sort() を行うことで、誤ってDataFrameの列を変更してしまう可能性がありました (GH 316)。

  • (無害な)FutureWarning を発生させる、その他の名前変更と非推奨化。

  • dropDataFrame.reset_index のオプションパラメータとして追加されました (GH 699)

パフォーマンス改善#

  • Cython化されたGroupBy集計はデータを事前にソートしなくなり、大幅な高速化を実現しました (GH 93)。Cythonにおけるndarrayデータ型の巧妙な操作により、Python関数によるGroupBy集計が大幅に高速化されました (GH 496)。

  • 渡された列ラベルがデータと一致しない場合のDataFrameコンストラクタのより良いエラーメッセージ (GH 497)

  • Python関数が渡された場合のマルチGroupBy集計のパフォーマンスを大幅に向上させ、Cythonでndarrayオブジェクトを再利用 (GH 496)

  • HDFStoreにタプルとフロートでインデックス付けされたオブジェクトを格納できるようになりました (GH 492)

  • デフォルトでSeries.to_stringで長さを表示しないようにし、length オプションを追加しました (GH 489)

  • マルチgroupbyのCythonコードを改善し、データをソートせずに集計できるようにしました (GH 93)

  • MultiIndexにタプルを格納することでMultiIndexのリインデックス速度を向上させ、後方互換性のためのアンピクルテストを実施

  • 専用のCython take関数を使用することで、列のリインデックスパフォーマンスを向上

  • 標準的な使用例におけるSeries.__getitem__のさらなるパフォーマンス調整

  • 一部のケース(スライスを取得する場合など)でインデックス辞書の作成を回避し、以前のバージョンからの回帰

  • NumPyがインストールされていない場合のsetup.pyのより親切なエラーメッセージ

  • PanelクラスでもNA処理操作(sum、meanなど)の共通セットを使用 (GH 536)

  • 通常の(非階層的な)インデックスを持つDataFrameに対してreset_indexを呼び出した場合のデフォルトの名前割り当て (GH 476)

  • level パラメータが渡された場合、Series/DataFrameの統計演算で可能な限りCython化されたグルーパーを使用 (GH 545)

  • スキップリストデータ構造をCに移植し、ほとんどの典型的な使用例で rolling_median を約5〜10倍高速化しました (GH 374)

貢献者#

このリリースには合計 18 人がパッチを提供しました。名前の横に「+」が付いている人は、初めてパッチを提供しました。

  • Adam Klein

  • Bayle Shanks +

  • Chris Billington +

  • Dieter Vandenbussche

  • Fabrizio Pollastri +

  • Graham Taylor +

  • Gregg Lind +

  • Josh Klein +

  • Luca Beltrame

  • Olivier Grisel +

  • スキッパー・シーボールド

  • Thomas Kluyver

  • Thomas Wiecki +

  • Wes McKinney

  • Wouter Overmeire

  • ヤロスラフ・ハルチェンコ

  • fabriziop +

  • theandygross +