バージョン 0.12.0 (2013年7月24日)#
これは 0.11.0 からのメジャーリリースであり、多数のバグ修正に加え、いくつかの新機能と機能強化が含まれています。
ハイライトには、一貫性のある I/O API 命名スキーム、html を読み込むルーチン、MultiIndex を csv ファイルに書き込むルーチン、STATA データファイルを読み書きするルーチン、JSON 形式ファイルを読み書きするルーチン、HDFStore の Python 3 サポート、filter による groupby 式のフィルタリング、正規表現を受け入れる刷新された replace ルーチンが含まれます。
APIの変更点#
I/O API は、
pd.read_csv()のようにアクセスされ、一般的にpandasオブジェクトを返す一連のトップレベルのreader関数により、はるかに一貫性のあるものになりました。
read_csv
read_excel
read_hdf
read_sql
read_json
read_html
read_stata
read_clipboard対応する
writer関数は、df.to_csv()のようにアクセスされるオブジェクトメソッドです。
to_csv
to_excel
to_hdf
to_sql
to_json
to_html
to_stata
to_clipboardSeries、DataFrame の剰余演算と整数除算を、
floatdtype と同様に動作するように修正し、適切にnp.nanまたはnp.infを返すようにしました (GH 3590)。これは、integerとfloatの dtype を異なる方法で扱う numpy のバグを修正します。In [1]: p = pd.DataFrame({"first": [4, 5, 8], "second": [0, 0, 3]}) In [2]: p % 0 Out[2]: first second 0 NaN NaN 1 NaN NaN 2 NaN NaN In [3]: p % p Out[3]: first second 0 0.0 NaN 1 0.0 NaN 2 0.0 0.0 In [4]: p / p Out[4]: first second 0 1.0 NaN 1 1.0 NaN 2 1.0 1.0 In [5]: p / 0 Out[5]: first second 0 inf NaN 1 inf NaN 2 inf inf
groupbyにsqueezeキーワードを追加し、グループが一意である場合に DataFrame -> Series への削減を可能にしました。これは 0.10.1 からの回帰です。以前の動作に戻しています。これは、グループが一意であるかどうかにかかわらず、groupby が同じ形状のオブジェクトを返すことを意味します。この問題を (GH 2893) から (GH 3596) で元に戻しました。In [2]: df2 = pd.DataFrame([{"val1": 1, "val2": 20}, ...: {"val1": 1, "val2": 19}, ...: {"val1": 1, "val2": 27}, ...: {"val1": 1, "val2": 12}]) In [3]: def func(dataf): ...: return dataf["val2"] - dataf["val2"].mean() ...: In [4]: # squeezing the result frame to a series (because we have unique groups) ...: df2.groupby("val1", squeeze=True).apply(func) Out[4]: 0 0.5 1 -0.5 2 7.5 3 -7.5 Name: 1, dtype: float64 In [5]: # no squeezing (the default, and behavior in 0.10.1) ...: df2.groupby("val1").apply(func) Out[5]: val2 0 1 2 3 val1 1 0.5 -0.5 7.5 -7.5ラベルベースのインデクサマスク (例: ブール値の Series) でブールインデックスを使用する場合、たとえ整数ラベルであっても
ilocでエラーを発生させるようにしました。ilocは純粋に位置ベースであるため、Series のラベルは整合できません (GH 3631)このケースはめったに使用されず、代替手段は豊富にあります。これにより、
ilocAPI は 純粋に 位置ベースであるという特性が保たれます。In [6]: df = pd.DataFrame(range(5), index=list("ABCDE"), columns=["a"]) In [7]: mask = df.a % 2 == 0 In [8]: mask Out[8]: A True B False C True D False E True Name: a, dtype: bool # this is what you should use In [9]: df.loc[mask] Out[9]: a A 0 C 2 E 4 # this will work as well In [10]: df.iloc[mask.values] Out[10]: a A 0 C 2 E 4
df.iloc[mask]はValueErrorを発生させます。プロット関数への
raise_on_error引数は削除されました。代わりに、プロット関数は、オブジェクトのdtypeがobjectの場合、TypeErrorを発生させます。これは、可能な限りobject配列の使用を避け、何かをプロットする必要がある場合は適切な数値 dtype にキャストすべきであることを示すためです。DataFrame のプロットメソッドに
colormapキーワードを追加しました。これは matplotlib のカラーマップオブジェクト (例: matplotlib.cm.jet) またはそのようなオブジェクトの文字列名 (例: 'jet') を受け入れます。カラーマップは各列の色を選択するためにサンプリングされます。詳細については、カラーマップ を参照してください。 (GH 3860)
DataFrame.interpolate()は非推奨になりました。DataFrame.fillna()およびDataFrame.replace()を代わりに使用してください。 (GH 3582, GH 3675, GH 3676)
DataFrame.replace()のmethodおよびaxis引数は非推奨になりました。
DataFrame.replaceのinfer_typesパラメータは削除され、デフォルトで変換が実行されるようになりました。 (GH 3907)
DataFrame.insertにキーワードallow_duplicatesを追加しました。Trueの場合、重複する列の挿入を許可し、デフォルトはFalse(0.12 より前と同じ) です。 (GH 3679)IO API
トップレベル関数
read_excelを追加し、以下の機能を置き換えました。元の API は非推奨であり、将来のバージョンで削除されます。from pandas.io.parsers import ExcelFile xls = ExcelFile("path_to_file.xls") xls.parse("Sheet1", index_col=None, na_values=["NA"])とともに
import pandas as pd pd.read_excel("path_to_file.xls", "Sheet1", index_col=None, na_values=["NA"])以下の機能と同等のトップレベル関数
read_sqlを追加しました。from pandas.io.sql import read_frame read_frame(...)
DataFrame.to_htmlとDataFrame.to_latexが最初の引数にパスを受け入れるようになりました (GH 3702)
datetime64[ns]に対する astypes をobject以外には許可せず、timedelta64[ns]をobject/intにのみ許可するようにしました (GH 3425)
datetime64dtype の動作が、特定のいわゆる削減操作に関して変更されました (GH 3726)。以下の操作は、Seriesに対して実行されるとTypeErrorを発生させ、DataFrameに対して実行されると 空のSeriesを返します。これは、例えばsliceオブジェクトのDataFrameに対してこれらの操作を実行するのと同様です。
sum, prod, mean, std, var, skew, kurt, corr, および cov
read_htmlは読み込み時にデフォルトでNoneとなり、lxml が解析に失敗した場合はbs4+html5libにフォールバックするようになりました。成功するまで試行するパーサーのリストも有効です。内部の
pandasクラス階層が (わずかに) 変更されました。以前のPandasObjectはPandasContainerと呼ばれるようになり、新しいPandasObjectがPandasContainerおよびIndex、Categorical、GroupBy、SparseList、SparseArray(+ それらの基底クラス) の基底クラスになりました。現在、PandasObjectは文字列メソッド (StringMixinから) を提供しています。 (GH 4090, GH 4092)新しい
StringMixinは、__unicode__メソッドが与えられると、Python 2 と Python 3 互換の文字列メソッド (__str__、__bytes__、および__repr__) を取得します。さらに、全体を通して文字列の安全性が確保されています。現在、pandas ライブラリの多くの場所で採用されています。 (GH 4090, GH 4092)
IOの拡張#
pd.read_html()は、HTML文字列、ファイル、またはURLを解析し、DataFramesを返すことができるようになりました(@cpcloud氏のご協力による)。(GH 3477, GH 3605, GH 3606, GH 3616). 単一のパーサーバックエンド (BeautifulSoup4 + html5lib) で動作します。ドキュメントを参照してください。
pd.read_html()を使用して、DataFrame.to_html()の出力を次のように読み取ることができます。In [11]: df = pd.DataFrame({"a": range(3), "b": list("abc")}) In [12]: print(df) a b 0 0 a 1 1 b 2 2 c In [13]: html = df.to_html() In [14]: alist = pd.read_html(html, index_col=0) In [15]: print(df == alist[0]) a b 0 True True 1 True True 2 True Trueここで
alistは Pythonlistであるため、pd.read_html()とDataFrame.to_html()は逆操作ではないことに注意してください。
pd.read_html()は、日付文字列の厳密な変換を実行しなくなりました (GH 3656)。警告
BeautifulSoup4 の古いバージョンをインストールする必要がある場合があります。インストールに関するドキュメントを参照してください。
Stata ファイルの読み書きのためのモジュール:
pandas.io.stataを追加しました (GH 1512)。これは、読み込み用のトップレベル関数read_stataと、書き込み用の DataFrame メソッドto_stataを介してアクセスできます。ドキュメントを参照してください。JSON 形式ファイルの読み書きのためのモジュール:
pandas.io.jsonを追加しました。read_jsonトップレベル関数で読み込み、to_jsonDataFrame メソッドで書き込みます。ドキュメントを参照してください。さまざまな問題に対応 (GH 1226, GH 3804, GH 3876, GH 3867, GH 1305)。csv 形式ファイルの読み書きにおける
MultiIndex列のサポート
read_csvのheaderオプションが、インデックスを読み取る行のリストを受け入れるようになりました。
tupleize_colsオプションは、to_csvとread_csvの両方で指定できるようになり、0.12 より前のバージョンのMultIndex列の読み書き動作 (タプルのリストを使用) との互換性を提供します。0.12 のデフォルトでは、タプルのリストを書き込み、タプルのリストをMultiIndex列として 解釈しません。注: 0.12 のデフォルト動作は以前のバージョンから変更されていませんが、0.13 からは、
MultiIndex列の書き込みと読み込みのデフォルトは新しい形式になります。 (GH 3571, GH 1651, GH 3141)
index_colが指定されていない場合 (例: インデックスがない場合、またはdf.to_csv(..., index=Falseで書き込んだ場合)、列インデックス上のすべてのnamesは 失われます。In [16]: mi_idx = pd.MultiIndex.from_arrays([[1, 2, 3, 4], list("abcd")], names=list("ab")) In [17]: mi_col = pd.MultiIndex.from_arrays([[1, 2], list("ab")], names=list("cd")) In [18]: df = pd.DataFrame(np.ones((4, 2)), index=mi_idx, columns=mi_col) In [19]: df.to_csv("mi.csv") In [20]: print(open("mi.csv").read()) c,,1,2 d,,a,b a,b,, 1,a,1.0,1.0 2,b,1.0,1.0 3,c,1.0,1.0 4,d,1.0,1.0 In [21]: pd.read_csv("mi.csv", header=[0, 1, 2, 3], index_col=[0, 1]) Out[21]: c 1 2 d a b a Unnamed: 2_level_2 Unnamed: 3_level_2 1 1.0 1.0 2 b 1.0 1.0 3 c 1.0 1.0 4 d 1.0 1.0Python3 での
HDFStore(viaPyTables 3.0.0) のサポート
read_hdfを介したイテレータサポートにより、イテレーション終了時にストアを自動的に開閉します。これは テーブル のみに適用されます。In [25]: path = 'store_iterator.h5' In [26]: pd.DataFrame(np.random.randn(10, 2)).to_hdf(path, 'df', table=True) In [27]: for df in pd.read_hdf(path, 'df', chunksize=3): ....: print(df) ....: 0 1 0 0.713216 -0.778461 1 -0.661062 0.862877 2 0.344342 0.149565 0 1 3 -0.626968 -0.875772 4 -0.930687 -0.218983 5 0.949965 -0.442354 0 1 6 -0.402985 1.111358 7 -0.241527 -0.670477 8 0.049355 0.632633 0 1 9 -1.502767 -1.225492
read_csvは、ファイルに列が含まれていない場合(例:すべて改行文字の場合)、より情報量の多いエラーメッセージを出すようになりました。
その他の機能強化#
DataFrame.replace()は、object dtype を持つ含まれるSeries上で正規表現を許可するようになりました。詳細は正規ドキュメントの例セクション 文字列式による置換 を参照してください。例えば、次のようにできます。
In [22]: df = pd.DataFrame({"a": list("ab.."), "b": [1, 2, 3, 4]}) In [23]: df.replace(regex=r"\s*\.\s*", value=np.nan) Out[23]: a b 0 a 1 1 b 2 2 NaN 3 3 NaN 4文字列
'.'のすべての出現を、その周囲にある0個以上の空白とともにNaNに置き換える場合。通常の文字列置換は期待通りに機能します。たとえば、次のようにできます。
In [24]: df.replace(".", np.nan) Out[24]: a b 0 a 1 1 b 2 2 NaN 3 3 NaN 4文字列
'.'のすべての出現をNaNに置き換える場合。
pd.melt()は、返される DataFrame のカスタム列名を指定するために、オプションのパラメーターvar_nameとvalue_nameを受け入れるようになりました。
pd.set_option()は、N 個のオプション、値のペアを許可するようになりました (GH 3667)。オプション
'a.b'と別のオプション'b.c'があったとします。それらを同時に設定できます。In [31]: pd.get_option('a.b') Out[31]: 2 In [32]: pd.get_option('b.c') Out[32]: 3 In [33]: pd.set_option('a.b', 1, 'b.c', 4) In [34]: pd.get_option('a.b') Out[34]: 1 In [35]: pd.get_option('b.c') Out[35]: 4グループオブジェクトの
filterメソッドは、元のオブジェクトのサブセットを返します。グループ合計が 2 より大きいグループに属する要素のみを取得したいとします。In [25]: sf = pd.Series([1, 1, 2, 3, 3, 3]) In [26]: sf.groupby(sf).filter(lambda x: x.sum() > 2) Out[26]: 3 3 4 3 5 3 dtype: int64
filterの引数は、グループ全体に適用された場合にTrueまたはFalseを返す関数でなければなりません。もう一つの便利な操作は、いくつかのメンバーしかいないグループに属する要素を除外することです。
In [27]: dff = pd.DataFrame({"A": np.arange(8), "B": list("aabbbbcc")}) In [28]: dff.groupby("B").filter(lambda x: len(x) > 2) Out[28]: A B 2 2 b 3 3 b 4 4 b 5 5 bあるいは、問題のあるグループを削除する代わりに、フィルターを通過しないグループが NaN で埋められた、同様にインデックス付けされたオブジェクトを返すことができます。
In [29]: dff.groupby("B").filter(lambda x: len(x) > 2, dropna=False) Out[29]: A B 0 NaN NaN 1 NaN NaN 2 2.0 b 3 3.0 b 4 4.0 b 5 5.0 b 6 NaN NaN 7 NaN NaNSeries および DataFrame の hist メソッドが
figsize引数を取るようになりました (GH 3834)DatetimeIndexes は、結合操作中に混合整数インデックスを変換しようとしなくなりました (GH 3877)。
Timestamp.min と Timestamp.max が、デフォルトの datetime.min と datetime.max (それぞれ) の代わりに、有効な Timestamp インスタンスを表すようになりました。SleepingPills 氏に感謝します。
テーブルが見つからず、BeautifulSoup==4.2.0 が検出された場合、
read_htmlはエラーを発生させるようになりました (GH 4214)
実験的機能#
カスタム祝日カレンダーとカスタム週マスクを持つ
DateOffsetsをサポートするための実験的なCustomBusinessDayクラスが追加されました。 (GH 2301)注
これは Numpy 1.7 で導入された
numpy.busdaycalendarAPI を使用するため、Numpy 1.7.0 以降が必要です。In [30]: from pandas.tseries.offsets import CustomBusinessDay In [31]: from datetime import datetime # As an interesting example, let's look at Egypt where # a Friday-Saturday weekend is observed. In [32]: weekmask_egypt = "Sun Mon Tue Wed Thu" # They also observe International Workers' Day so let's # add that for a couple of years In [33]: holidays = ["2012-05-01", datetime(2013, 5, 1), np.datetime64("2014-05-01")] In [34]: bday_egypt = CustomBusinessDay(holidays=holidays, weekmask=weekmask_egypt) In [35]: dt = datetime(2013, 4, 30) In [36]: print(dt + 2 * bday_egypt) 2013-05-05 00:00:00 In [37]: dts = pd.date_range(dt, periods=5, freq=bday_egypt) In [38]: print(pd.Series(dts.weekday, dts).map(pd.Series("Mon Tue Wed Thu Fri Sat Sun".split()))) 2013-04-30 Tue 2013-05-02 Thu 2013-05-05 Sun 2013-05-06 Mon 2013-05-07 Tue Freq: C, dtype: object
バグ修正#
プロット関数は、関連するオブジェクトの dtype が
objectである場合、プロットを試みる前にTypeErrorを発生させるようになりました (GH 1818, GH 3572, GH 3911, GH 3912)。しかし、可能な場合はオブジェクト配列を数値配列に変換しようとします。これにより、例えば浮動小数点数を含むオブジェクト配列をプロットできます。これは描画が行われる前に行われるため、誤ったプロットが表示されるのを防ぎます。
fillnaメソッドは、valueパラメータがリストまたはタプルである場合、TypeErrorを発生させるようになりました。
Series.strがイテレーションをサポートするようになりました (GH 3638)。Series内の各文字列の個々の要素をイテレーションできます。各イテレーションは、元のSeriesの各インデックスに単一の文字、またはNaNを含むSeriesを生成します。例として、In [38]: strs = "go", "bow", "joe", "slow" In [32]: ds = pd.Series(strs) In [33]: for s in ds.str: ...: print(s) 0 g 1 b 2 j 3 s dtype: object 0 o 1 o 2 o 3 l dtype: object 0 NaN 1 w 2 e 3 o dtype: object 0 NaN 1 NaN 2 NaN 3 w dtype: object In [41]: s Out[41]: 0 NaN 1 NaN 2 NaN 3 w dtype: object In [42]: s.dropna().values.item() == "w" Out[42]: Trueイテレータによって生成される最後の要素は、
Series内の最長文字列の最後の要素を含むSeriesとなり、他のすべての要素はNaNになります。ここで、'slow'が最長文字列であり、同じ長さの他の文字列がないため、生成されたSeries内で非ヌル文字列は'w'のみです。
HDFストア非一意なインデックスのサポートが明確化されました (GH 3468)。
DataFrame 内の重複するインデックスに新しいインデックスを割り当てると失敗するバグを修正しました (GH 3468)
重複するインデックスを持つ DataFrame の構築を修正しました。
異なる dtype 間で重複するインデックスを許可する ref_locs サポートが追加され、iget サポートが常にインデックスを見つけられるようになりました (dtype が異なる場合でも) (GH 2194)
非ユニークなインデックスを持つ DataFrame での applymap が動作するようになりました (警告を削除) (GH 2786)、および修正 (GH 3230)
重複する列を処理するように to_csv を修正しました (GH 3495)
getitem を使用した重複インデックスは、正しい順序で項目を返すようになり (GH 3455, GH 3457)、一意のインデックスと同様に欠落要素を処理します (GH 3561)。
重複するインデックスと空の DataFrame.from_records は、正しいフレームを返します (GH 3562)
異なるdtype間で重複する列がある場合の、重複しない列を生成するConcatのバグを修正しました (GH 3602)
非一意な列への挿入/削除を許可 (GH 3679)
locおよび関連関数によるスライスを使用した非一意なインデックス付けのバグを修正しました (GH 3659)非一意な列への挿入/削除を許可 (GH 3679)
reindexを拡張し、非一意なインデックスを正しく処理するようにしました (GH 3679)
DataFrame.itertuples()は、重複する列名を持つフレームでも動作するようになりました (GH 3873)
ilocによる非一意なインデックス付けのバグ (GH 4017); 位置ベースの取得のためにreindexにtakeable引数を追加しました。
.ix/.locおよび__getitem__を介した series における非一意なインデックス付けを許可 (GH 4246)
.ix/.locを使用した非ユニークなインデックス付けのメモリ割り当てに関する問題を修正しました (GH 4280)
DataFrame.from_recordsが空の recarrays を受け入れなかったバグを修正しました (GH 3682)
read_htmlがテストを正しくスキップするようになりました (GH 3741)
DataFrame.replaceで、to_replace引数にコンパイル済みの正規表現が渡された場合に動作しなかったバグを修正しました (GH 3907)
networkテストデコレータを改良し、IOError(したがってURLErrorも) をキャッチできるようにしました。with_connectivity_checkデコレータを追加し、ネットワーク接続があるかどうかを確認するためのプロキシとしてウェブサイトを明示的にチェックできるようにしました。さらに、デコレータの新しいoptional_argsデコレータファクトリも追加しました。 (GH 3910, GH 3914)テストでソケットが開きすぎたため、接続リセットの問題が発生するバグを修正しました (GH 3982, GH 3985, GH 4028, GH 4054)
test_yahoo, test_google でのテスト失敗を修正。シンボルが取得されずにアクセスされていたためです (GH 3982, GH 3985, GH 4028, GH 4054)
Series.histは、フィギュアが渡されない場合、現在の環境からフィギュアを取得するようになりました。1xN DataFrameが1xNマスクで失敗するバグを修正しました (GH 4071)
Python 3 で
toxを実行すると、pickle のインポートが互換性のない方法で書き換えられてしまうバグを修正しました (GH 4062, GH 4063)。sharex および sharey が grouped_hist に渡されないバグを修正しました (GH 4089)
DataFrame.replaceで、regex=False の場合にネストされた dict が反復処理されなかったバグを修正しました (GH 4115)
to_datetimeのformat引数を使用した場合のマイクロ秒の解析におけるバグを修正しました (GH 4152)
PandasAutoDateLocatorにおけるバグを修正しました。invert_xaxisが誤ってMilliSecondLocatorをトリガーしていました (GH 3990)。matplotlib 1.1.1 で無効なカラーマップに対してエラーを発生させなかったプロットのバグを修正しました (GH 4215)
DataFrame.plot(kind='kde')での凡例表示のバグを修正しました (GH 4216)Index のスライスが name 属性を保持しなかったバグを修正しました (GH 4226)
特定のタイムゾーンの文字列配列で
DatetimeIndexを初期化する際のバグを修正しました (GH 4229)html5lib が適切にスキップされなかったバグを修正しました (GH 4265)
get_data_famafrench が正しいファイルエッジを使用していなかったバグを修正しました (GH 4281)
完全なリストについては、GitHub の完全なリリースノートまたはイシュートラッカーを参照してください。
貢献者#
このリリースには合計50人がパッチを貢献しました。「+」マークが付いている人は、今回初めてパッチを貢献しました。
アンディ・ヘイデン
Chang She
クリストファー・ウィーラン
Damien Garaud
Dan Allan
Dan Birken
Dieter Vandenbussche
Dražen Lučanin
Gábor Lipták +
Jeff Mellen +
Jeff Tratner +
Jeffrey Tratner +
Jonathan deWerd +
Joris Van den Bossche +
Juraj Niznan +
Karmel Allison
ケルシー・ジョーダル
Kevin Stone +
Kieran O’Mahony
Kyle Meyer +
Mike Kelly +
PKEuS +
Patrick O’Brien +
Phillip Cloud
Richard Höchenberger +
スキッパー・シーボールド
SleepingPills +
Tobias Brandt
Tom Farnbauer +
TomAugspurger +
Trent Hauck +
Wes McKinney
Wouter Overmeire
ヤロスラフ・ハルチェンコ
conmai +
danielballan +
davidshinn +
dieterv77
duozhang +
ejnens +
gliptak +
jniznan +
jreback
レクシュアル
nipunreddevil +
ogiaquino +
stonebig +
tim smith +
timmie
y-p