バージョン 0.13.0 (2014年1月3日)#
これは0.12.0からのメジャーリリースで、多数のAPI変更、いくつかの新機能と機能強化、そして多数のバグ修正が含まれています。
主な機能は以下の通りです。
新しいインデックスタイプ
Float64Indexのサポート、およびその他のインデックス強化HDFStoreはクエリ指定のための新しい文字列ベースの構文を持つ新しい補間メソッドのサポート
timedelta操作の更新新しい文字列操作メソッド
extractオフセットのナノ秒サポート
DataFramesの
isin
いくつかの実験的な機能が追加されました。これには以下が含まれます。
式評価のための新しい
eval/queryメソッドmsgpackシリアライゼーションのサポートGoogleの
BigQueryへのI/Oインターフェース
いくつかの新しいまたは更新されたドキュメントセクションがあります。これには以下が含まれます。
SQLとの比較は、SQLに慣れているがまだpandasを学んでいる人々に役立つはずです。
Rとの比較は、Rからpandasへのイディオム翻訳です。
パフォーマンスの向上は、
eval/queryでpandasのパフォーマンスを向上させる方法です。
警告
0.13.0では、Seriesは内部的にリファクタリングされ、ndarrayのサブクラスではなく、pandasの他のコンテナと同様にNDFrameのサブクラスになりました。これは、非常に限られたAPIへの影響しかない透過的な変更であるはずです。内部のリファクタリングを参照してください
APIの変更点#
read_excelは、sheetname引数に読み込むシートのインデックスを与える整数をサポートするようになりました(GH 4301)。テキストパーサーは、"inf"、"Inf"、"-Inf"、"iNf"など、infのように読めるものをすべて無限大として扱うようになりました(GH 4220、GH 4219)。これは
read_table、read_csvなどに影響します。@jtratnerのおかげで、
pandasは2to3の必要なくPython 2/3互換になりました。その結果、pandasはイテレータをより広範囲に使用するようになりました。これにより、Benjamin Petersonのsixライブラリの大部分がcompatに導入されました(GH 4384、GH 4375、GH 4372)。pandas.util.compatとpandas.util.py3compatはpandas.compatに統合されました。pandas.compatには、2/3互換性を可能にする多くの関数が含まれています。range、filter、map、zipのリスト版とイテレータ版、およびPython 3互換性に必要なその他の要素が含まれています。lmap、lzip、lrange、lfilterはすべて、numpy、添字、およびpandasコンストラクタとの互換性のために、イテレータではなくリストを生成します(GH 4384、GH 4375、GH 4372)。負のインデクサを持つ
Series.getは、[]と同じ値を返すようになりました(GH 4390)。IndexおよびMultiIndexがメタデータ(levels、labels、names)を処理する方法の変更(GH 4039)# previously, you would have set levels or labels directly >>> pd.index.levels = [[1, 2, 3, 4], [1, 2, 4, 4]] # now, you use the set_levels or set_labels methods >>> index = pd.index.set_levels([[1, 2, 3, 4], [1, 2, 4, 4]]) # similarly, for names, you can rename the object # but setting names is not deprecated >>> index = pd.index.set_names(["bob", "cranberry"]) # and all methods take an inplace kwarg - but return None >>> pd.index.set_names(["bob", "cranberry"], inplace=True)
今後、
NDFrameオブジェクトを使ったすべての除算は、将来のインポートに関係なく真の除算になります。これは、pandasオブジェクトに対する操作がデフォルトで浮動小数点除算を使用し、浮動小数点dtypeを返すことを意味します。整数除算を行うには//とfloordivを使用できます。整数除算
In [3]: arr = np.array([1, 2, 3, 4]) In [4]: arr2 = np.array([5, 3, 2, 1]) In [5]: arr / arr2 Out[5]: array([0, 0, 1, 4]) In [6]: pd.Series(arr) // pd.Series(arr2) Out[6]: 0 0 1 0 2 1 3 4 dtype: int64
真の除算
In [7]: pd.Series(arr) / pd.Series(arr2) # no future import required Out[7]: 0 0.200000 1 0.666667 2 1.500000 3 4.000000 dtype: float64
fillna/ffill/bfillにdowncast='infer'が渡された場合、dtypeを推論しダウンキャストします(GH 4604)。すべてのNDFrameオブジェクトの
__nonzero__は、ValueErrorを発生させるようになりました。これは(GH 1073、GH 4633)の動作に戻ります。より詳細な説明についてはgotchasを参照してください。これにより、本質的に曖昧な、全体のpandasオブジェクトに対するブール比較が防止されます。これらはすべて
ValueErrorを発生させます。>>> df = pd.DataFrame({'A': np.random.randn(10), ... 'B': np.random.randn(10), ... 'C': pd.date_range('20130101', periods=10) ... }) ... >>> if df: ... pass ... Traceback (most recent call last): ... ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> df1 = df >>> df2 = df >>> df1 and df2 Traceback (most recent call last): ... ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). >>> d = [1, 2, 3] >>> s1 = pd.Series(d) >>> s2 = pd.Series(d) >>> s1 and s2 Traceback (most recent call last): ... ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
単一要素のブールSeriesの評価を容易にするため、NDFrameオブジェクトに
.bool()メソッドを追加しました。>>> pd.Series([True]).bool() True >>> pd.Series([False]).bool() False >>> pd.DataFrame([[True]]).bool() True >>> pd.DataFrame([[False]]).bool() False
Index以外のすべてのNDFrame (
Series、DataFrame、Panel、Panel4D、SparsePanelなど) は、すべての算術演算子と算術フレキシブルメソッド (add、sub、mulなど) をサポートするようになりました。SparsePanelは、非スカラーでのpowまたはmodをサポートしていません。( GH 3765)SeriesとDataFrameは、軸/Seriesごとの統計的モードを計算するmode()メソッドを持つようになりました(GH 5367)。連鎖代入は、ユーザーがコピーに代入している場合に、デフォルトで警告を発するようになりました。これはオプション
mode.chained_assignmentで変更できます。許容されるオプションはraise/warn/Noneです。ドキュメントを参照してください。In [1]: dfc = pd.DataFrame({'A': ['aaa', 'bbb', 'ccc'], 'B': [1, 2, 3]}) In [2]: pd.set_option('chained_assignment', 'warn')
これを試みると、以下の警告/例外が表示されます。
In [3]: dfc.loc[0]['A'] = 1111
Traceback (most recent call last) ... SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
これが正しい代入方法です。
In [4]: dfc.loc[0, 'A'] = 11 In [5]: dfc Out[5]: A B 0 11 1 1 bbb 2 2 ccc 3
Panel.reindexは、他のNDFrameオブジェクトに準拠するため、Panel.reindex(items=None, major_axis=None, minor_axis=None, **kwargs)という呼び出しシグネチャを持っています。内部リファクタリングで詳細を確認してください。他の
NDFrameオブジェクトに準拠するため、Panel.reindexの呼び出しシグネチャはPanel.reindex(items=None, major_axis=None, minor_axis=None, **kwargs)です。内部リファクタリングを参照してください。
Series.argminとSeries.argmaxは、Series.idxminとSeries.idxmaxのエイリアスになりました。これらは、それぞれ最小または最大要素のインデックスを返します。0.13.0以前は、これらは最小/最大要素の位置を返していました(GH 6214)。
以前のバージョンの非推奨/変更#
これらは0.12以前に発表された変更で、0.13.0から有効になっています。
非推奨の
Factorを削除(GH 3650)非推奨の
set_printoptions/reset_printoptionsを削除(GH 3046)非推奨の
_verbose_infoを削除(GH 3215)pandas.io.parsersから非推奨のread_clipboard/to_clipboard/ExcelFile/ExcelWriterを削除しました(GH 3717)。これらはメインのpandas名前空間で関数として利用可能です(例:pd.read_clipboard)。tupleize_colsのデフォルトは、to_csvとread_csvの両方でFalseになりました。0.12での公正な警告です(GH 3604)。display.max_seq_lenのデフォルト値がNoneから100に変更されました。これにより、様々な場所での長いシーケンスの切り詰め表示("...")が有効になります。(GH 3391)
非推奨#
0.13.0で非推奨
非推奨の
iterkvは将来のリリースで削除されます(これは2to3の変更を回避するために使用されたiteritemsのエイリアスでした)。(GH 4384, GH 4375, GH 4372)文字列メソッド
matchは非推奨になりました。その役割は現在、extractによってより慣用的に実行されます。将来のリリースでは、matchのデフォルトの動作が変更され、ブールインデクサを返すcontainsに類似するようになります。(それらの違いは厳密性です。matchはre.matchに依存し、containsはre.searchに依存します。)このリリースでは、非推奨の動作がデフォルトですが、キーワード引数as_indexer=Trueを通じて新しい動作が利用可能です。
インデックスAPIの変更#
0.13以前は、特定の軸のインデックスに含まれていない値を設定するためにラベルインデクサ(.loc/.ix)を使用することは不可能でした(GH 2578)。ドキュメントを参照してください。
Seriesの場合、これは実質的に追加操作です。
In [6]: s = pd.Series([1, 2, 3])
In [7]: s
Out[7]:
0 1
1 2
2 3
dtype: int64
In [8]: s[5] = 5.
In [9]: s
Out[9]:
0 1.0
1 2.0
2 3.0
5 5.0
dtype: float64
In [10]: dfi = pd.DataFrame(np.arange(6).reshape(3, 2),
....: columns=['A', 'B'])
....:
In [11]: dfi
Out[11]:
A B
0 0 1
1 2 3
2 4 5
これは以前はKeyErrorを発生させていました。
In [12]: dfi.loc[:, 'C'] = dfi.loc[:, 'A']
In [13]: dfi
Out[13]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
これはappend操作のようなものです。
In [14]: dfi.loc[3] = 5
In [15]: dfi
Out[15]:
A B C
0 0 1 0
1 2 3 2
2 4 5 4
3 5 5 5
任意の軸でのパネル設定操作は、入力をパネルに合わせます。
In [20]: p = pd.Panel(np.arange(16).reshape(2, 4, 2),
....: items=['Item1', 'Item2'],
....: major_axis=pd.date_range('2001/1/12', periods=4),
....: minor_axis=['A', 'B'], dtype='float64')
....:
In [21]: p
Out[21]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to B
In [22]: p.loc[:, :, 'C'] = pd.Series([30, 32], index=p.items)
In [23]: p
Out[23]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to C
In [24]: p.loc[:, :, 'C']
Out[24]:
Item1 Item2
2001-01-12 30.0 32.0
2001-01-13 30.0 32.0
2001-01-14 30.0 32.0
2001-01-15 30.0 32.0
Float64Index APIの変更#
新しいインデックスタイプ
Float64Indexが追加されました。これは、インデックス作成時に浮動小数点値を渡すと自動的に作成されます。これにより、純粋なラベルベースのスライシングパラダイムが可能になり、スカラーインデックス作成とスライシングで[], ix, locがまったく同じように機能するようになります(GH 263)。構築は浮動小数点型の値に対してデフォルトで行われます。
In [16]: index = pd.Index([1.5, 2, 3, 4.5, 5]) In [17]: index Out[17]: Index([1.5, 2.0, 3.0, 4.5, 5.0], dtype='float64') In [18]: s = pd.Series(range(5), index=index) In [19]: s Out[19]: 1.5 0 2.0 1 3.0 2 4.5 3 5.0 4 dtype: int64
[],.ix,.locのスカラ選択は常にラベルベースになります。整数は等しい浮動小数点インデックスと一致します(例:3は3.0と同等です)。In [20]: s[3] Out[20]: 2 In [21]: s.loc[3] Out[21]: 2
唯一の位置によるインデックス指定は
ilocを介して行われます。In [22]: s.iloc[3] Out[22]: 3
見つからないスカラーインデックスは
KeyErrorを発生させます。スライシングは、
[],ix,locの場合は常にインデックスの値に対して行われ、ilocの場合は常に位置に基づいて行われます。In [23]: s[2:4] Out[23]: 2.0 1 3.0 2 dtype: int64 In [24]: s.loc[2:4] Out[24]: 2.0 1 3.0 2 dtype: int64 In [25]: s.iloc[2:4] Out[25]: 3.0 2 4.5 3 dtype: int64
浮動小数点インデックスでは、浮動小数点数を使用したスライシングが許可されます。
In [26]: s[2.1:4.6] Out[26]: 3.0 2 4.5 3 dtype: int64 In [27]: s.loc[2.1:4.6] Out[27]: 3.0 2 4.5 3 dtype: int64
他のインデックスタイプでのインデックス指定は(
[],ixのフォールバック位置指定とともに)保持されますが、Float64Index以外のインデックスでの浮動小数点スライシングはTypeErrorを発生させるようになりました。In [1]: pd.Series(range(5))[3.5] TypeError: the label [3.5] is not a proper indexer for this index type (Int64Index) In [1]: pd.Series(range(5))[3.5:4.5] TypeError: the slice start [3.5] is not a proper indexer for this index type (Int64Index)
スカラー浮動小数点インデクサの使用は将来のバージョンで非推奨になりますが、今のところは許可されています。
In [3]: pd.Series(range(5))[3.0] Out[3]: 3
HDFStore APIの変更点#
クエリ形式の変更。より文字列に近いクエリ形式がサポートされるようになりました。ドキュメントを参照してください。
In [28]: path = 'test.h5' In [29]: dfq = pd.DataFrame(np.random.randn(10, 4), ....: columns=list('ABCD'), ....: index=pd.date_range('20130101', periods=10)) ....: In [30]: dfq.to_hdf(path, key='dfq', format='table', data_columns=True)
インライン関数評価を使用してブール式を使用します。
In [31]: pd.read_hdf(path, 'dfq', ....: where="index>Timestamp('20130104') & columns=['A', 'B']") ....: Out[31]: A B 2013-01-05 -0.424972 0.567020 2013-01-06 -0.673690 0.113648 2013-01-07 0.404705 0.577046 2013-01-08 -0.370647 -1.157892 2013-01-09 1.075770 -0.109050 2013-01-10 0.357021 -0.674600
インライン列参照を使用する
In [32]: pd.read_hdf(path, 'dfq', ....: where="A>0 or C>0") ....: Out[32]: A B C D 2013-01-01 0.469112 -0.282863 -1.509059 -1.135632 2013-01-02 1.212112 -0.173215 0.119209 -1.044236 2013-01-04 0.721555 -0.706771 -1.039575 0.271860 2013-01-05 -0.424972 0.567020 0.276232 -1.087401 2013-01-07 0.404705 0.577046 -1.715002 -1.039268 2013-01-09 1.075770 -0.109050 1.643563 -1.469388 2013-01-10 0.357021 -0.674600 -1.776904 -0.968914
formatキーワードがtableキーワードの代わりになりました。許可される値はfixed(f)またはtable(t)で、0.13.0以前のデフォルトと同じです。例えば、putはfixed形式を意味し、appendはtable形式を意味します。このデフォルト形式は、オプションio.hdf.default_formatを設定することで設定できます。In [33]: path = 'test.h5' In [34]: df = pd.DataFrame(np.random.randn(10, 2)) In [35]: df.to_hdf(path, key='df_table', format='table') In [36]: df.to_hdf(path, key='df_table2', append=True) In [37]: df.to_hdf(path, key='df_fixed') In [38]: with pd.HDFStore(path) as store: ....: print(store) ....: <class 'pandas.io.pytables.HDFStore'> File path: test.h5
テーブル書き込みパフォーマンスが大幅に向上
テーブル形式で渡された
Seriesを処理する(GH 4330)timedelta64[ns]dtypeをテーブルにシリアル化できるようになりました(GH 3577)。ドキュメントを参照してください。基盤となるファイルハンドルがis_openかどうかを示す
is_openプロパティが追加されました。閉じたストアは、ストアを表示したときに「CLOSED」と報告するようになりました(エラーを発生させるのではなく)(GH 4409)。HDFStoreを閉じると、そのHDFStoreのインスタンスは閉じられますが、実際のファイルが閉じられるのは、開いているすべてのハンドルに対する参照カウント(PyTablesによる)が0の場合のみです。基本的に、変数によって参照されるHDFStoreのローカルインスタンスがあります。閉じると、閉じられたと報告されます。他の参照(同じファイルへの)は、それら自体が閉じられるまで動作し続けます。閉じられたファイルに対してアクションを実行すると、ClosedFileErrorが発生します。In [39]: path = 'test.h5' In [40]: df = pd.DataFrame(np.random.randn(10, 2)) In [41]: store1 = pd.HDFStore(path) In [42]: store2 = pd.HDFStore(path) In [43]: store1.append('df', df) In [44]: store2.append('df2', df) In [45]: store1 Out[45]: <class 'pandas.io.pytables.HDFStore'> File path: test.h5 In [46]: store2 Out[46]: <class 'pandas.io.pytables.HDFStore'> File path: test.h5 In [47]: store1.close() In [48]: store2 Out[48]: <class 'pandas.io.pytables.HDFStore'> File path: test.h5 In [49]: store2.close() In [50]: store2 Out[50]: <class 'pandas.io.pytables.HDFStore'> File path: test.h5
テーブルから重複行を取得する際に
DuplicateWarningで置き換えられた_quiet属性を削除しました(GH 4367)。openからwarn引数を削除しました。代わりに、OPENファイルハンドルでmode='w'を使用しようとすると、PossibleDataLossError例外が発生します(GH 4367)。渡されたlocations配列またはマスクを
where条件として許可します(GH 4467)。例についてはドキュメントを参照してください。appendにキーワードdropna=Trueを追加して、すべてのNaN行をストアに書き込まないようにするかどうかを変更します(デフォルトはTrueで、すべてのNaN行は書き込まれません)。これはオプションio.hdf.dropna_tableでも設定できます(GH 4625)。ストア作成引数を渡す; インメモリストアをサポートするために使用可能
DataFrame reprの変更#
DataFrameのHTMLおよびプレーンテキスト表現は、特定のサイズを超えると短い情報ビューに切り替わる代わりに、テーブルの切り詰められたビューを表示するようになりました(GH 4886、GH 5550)。これにより、小さなDataFrameが大きくなるにつれて表現の一貫性が向上します。
情報ビューを取得するには、DataFrame.info()を呼び出します。大きなDataFrameのreprとして情報ビューを好む場合は、set_option('display.large_repr', 'info')を実行することでこれを設定できます。
機能強化#
df.to_clipboard()は、dfデータを直接Excelに貼り付けることができる新しいexcelキーワードを覚えました(デフォルトで有効)。(GH 5070)。read_htmlは、ValueErrorをキャッチして発生させる代わりに、URLErrorを発生させるようになりました(GH 4303、GH 4305)。read_clipboard()とto_clipboard()のテストを追加しました(GH 4282)。クリップボード機能がPySideで動作するようになりました(GH 4282)。
プロット引数に重複する色とスタイル引数が含まれている場合に、より情報的なエラーメッセージを追加しました(GH 4402)。
to_dictは、出力タイプとしてrecordsを受け入れるようになりました。列キーの辞書配列を返します。(GH 4936)dummy_naを使用したget_dummiesでのNaN処理(GH 4446)# previously, nan was erroneously counted as 2 here # now it is not counted at all In [51]: pd.get_dummies([1, 2, np.nan]) Out[51]: 1.0 2.0 0 True False 1 False True 2 False False # unless requested In [52]: pd.get_dummies([1, 2, np.nan], dummy_na=True) Out[52]: 1.0 2.0 NaN 0 True False False 1 False True False 2 False False True
timedelta64[ns]操作。ドキュメントを参照してください。警告
これらの操作のほとんどは
numpy >= 1.7を必要とします。新しいトップレベルの
to_timedeltaを使用すると、標準のtimedelta形式(to_csvによって生成される)のスカラーまたは配列をtimedeltaタイプ(ナノ秒単位のnp.timedelta64)に変換できます。In [53]: pd.to_timedelta('1 days 06:05:01.00003') Out[53]: Timedelta('1 days 06:05:01.000030') In [54]: pd.to_timedelta('15.5us') Out[54]: Timedelta('0 days 00:00:00.000015500') In [55]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan']) Out[55]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None) In [56]: pd.to_timedelta(np.arange(5), unit='s') Out[56]: TimedeltaIndex(['0 days 00:00:00', '0 days 00:00:01', '0 days 00:00:02', '0 days 00:00:03', '0 days 00:00:04'], dtype='timedelta64[ns]', freq=None) In [57]: pd.to_timedelta(np.arange(5), unit='d') Out[57]: TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)
timedelta64[ns]dtypeのSeriesは、別のtimedelta64[ns]オブジェクトで除算したり、astypeしてfloat64dtyped Seriesを生成できるようになりました。これは周波数変換です。詳細についてはドキュメントを参照してください。In [58]: import datetime In [59]: td = pd.Series(pd.date_range('20130101', periods=4)) - pd.Series( ....: pd.date_range('20121201', periods=4)) ....: In [60]: td[2] += np.timedelta64(datetime.timedelta(minutes=5, seconds=3)) In [61]: td[3] = np.nan In [62]: td Out[62]: 0 31 days 00:00:00 1 31 days 00:00:00 2 31 days 00:05:03 3 NaT dtype: timedelta64[ns]
# to days In [63]: td / np.timedelta64(1, 'D') Out[63]: 0 31.000000 1 31.000000 2 31.003507 3 NaN dtype: float64 In [64]: td.astype('timedelta64[D]') Out[64]: 0 31.0 1 31.0 2 31.0 3 NaN dtype: float64 # to seconds In [65]: td / np.timedelta64(1, 's') Out[65]: 0 2678400.0 1 2678400.0 2 2678703.0 3 NaN dtype: float64 In [66]: td.astype('timedelta64[s]') Out[66]: 0 2678400.0 1 2678400.0 2 2678703.0 3 NaN dtype: float64
timedelta64[ns]Seriesを整数または整数Seriesで除算または乗算するIn [63]: td * -1 Out[63]: 0 -31 days +00:00:00 1 -31 days +00:00:00 2 -32 days +23:54:57 3 NaT dtype: timedelta64[ns] In [64]: td * pd.Series([1, 2, 3, 4]) Out[64]: 0 31 days 00:00:00 1 62 days 00:00:00 2 93 days 00:15:09 3 NaT dtype: timedelta64[ns]
絶対
DateOffsetオブジェクトはtimedeltasと同等に機能しますIn [65]: from pandas import offsets In [66]: td + offsets.Minute(5) + offsets.Milli(5) Out[66]: 0 31 days 00:05:00.005000 1 31 days 00:05:00.005000 2 31 days 00:10:03.005000 3 NaT dtype: timedelta64[ns]
fillnaがtimedeltasでサポートされるようになりました
In [67]: td.fillna(pd.Timedelta(0)) Out[67]: 0 31 days 00:00:00 1 31 days 00:00:00 2 31 days 00:05:03 3 0 days 00:00:00 dtype: timedelta64[ns] In [68]: td.fillna(datetime.timedelta(days=1, seconds=5)) Out[68]: 0 31 days 00:00:00 1 31 days 00:00:00 2 31 days 00:05:03 3 1 days 00:00:05 dtype: timedelta64[ns]
timedeltasに対して数値削減操作を実行できます。
In [69]: td.mean() Out[69]: Timedelta('31 days 00:01:41') In [70]: td.quantile(.1) Out[70]: Timedelta('31 days 00:00:00')
plot(kind='kde')は、オプションパラメータbw_methodとindを受け入れるようになりました。これらは、それぞれ帯域幅を設定するためにscipy.stats.gaussian_kde()(scipy >= 0.11.0の場合)に、評価されるインデックスを指定するためにgkde.evaluate()に渡されます。scipyドキュメントを参照してください。(GH 4298)DataFrameコンストラクタは、numpyマスクされたレコード配列を受け入れるようになりました(GH 3478)。
新しいベクトル化された文字列メソッド
extractは、正規表現の一致をより便利に返します。In [71]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\\d)') Out[71]: 0 0 1 1 2 2 NaN
一致しない要素は
NaNを返します。複数のグループを持つ正規表現を抽出すると、グループごとに1つの列を持つDataFrameが返されます。In [72]: pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\\d)') Out[72]: 0 1 0 a 1 1 b 2 2 NaN NaN
一致しない要素は
NaNの行を返します。したがって、乱雑な文字列のSeriesは、タプルやre.matchオブジェクトにアクセスするためにget()を必要とせずに、クリーンアップされた、またはより有用な文字列の同じインデックスを持つSeriesまたはDataFrameに変換できます。名前付きグループ
In [73]: pd.Series(['a1', 'b2', 'c3']).str.extract( ....: '(?P<letter>[ab])(?P<digit>\\d)') ....: Out[73]: letter digit 0 a 1 1 b 2 2 NaN NaN
およびオプションのグループも使用できます。
In [74]: pd.Series(['a1', 'b2', '3']).str.extract( ....: '(?P<letter>[ab])?(?P<digit>\\d)') ....: Out[74]: letter digit 0 a 1 1 b 2 2 NaN 3
read_stataはStata 13形式を受け入れるようになりました(GH 4291)。read_fwfは、データが関数に提供された区切り文字を使用して正しく区切られ、適切に配置された列を持っている場合、ファイルの最初の100行から列の仕様を推測するようになりました(GH 4488)。オフセットとしてナノ秒時間のサポート
警告
これらの操作には
numpy >= 1.7が必要です。秒以下の範囲の期間変換が再構築され、ナノ秒まで拡張されました。ナノ秒範囲の期間が利用可能になりました。
In [79]: pd.date_range('2013-01-01', periods=5, freq='5N') Out[79]: DatetimeIndex([ '2013-01-01 00:00:00', '2013-01-01 00:00:00.000000005', '2013-01-01 00:00:00.000000010', '2013-01-01 00:00:00.000000015', '2013-01-01 00:00:00.000000020'], dtype='datetime64[ns]', freq='5N')
またはオフセットとしての頻度
In [75]: pd.date_range('2013-01-01', periods=5, freq=pd.offsets.Nano(5)) Out[75]: DatetimeIndex([ '2013-01-01 00:00:00', '2013-01-01 00:00:00.000000005', '2013-01-01 00:00:00.000000010', '2013-01-01 00:00:00.000000015', '2013-01-01 00:00:00.000000020'], dtype='datetime64[ns]', freq='5ns')
タイムスタンプはナノ秒単位で変更できます。
In [76]: t = pd.Timestamp('20130101 09:01:02') In [77]: t + pd.tseries.offsets.Nano(123) Out[77]: Timestamp('2013-01-01 09:01:02.000000123')
DataFrames用の新しいメソッド
isinが追加され、ブールインデックス付けとうまく連携します。isinの引数(DataFrameと比較する対象)は、DataFrame、Series、辞書、または値の配列にすることができます。詳細についてはドキュメントを参照してください。いずれかの条件が満たされている行を取得するには
In [78]: dfi = pd.DataFrame({'A': [1, 2, 3, 4], 'B': ['a', 'b', 'f', 'n']}) In [79]: dfi Out[79]: A B 0 1 a 1 2 b 2 3 f 3 4 n In [80]: other = pd.DataFrame({'A': [1, 3, 3, 7], 'B': ['e', 'f', 'f', 'e']}) In [81]: mask = dfi.isin(other) In [82]: mask Out[82]: A B 0 True False 1 False False 2 True True 3 False False In [83]: dfi[mask.any(axis=1)] Out[83]: A B 0 1 a 2 3 f
Seriesは、単一列のDataFrameに変換するためのto_frameメソッドをサポートするようになりました(GH 5164)。ここにリストされているすべてのRデータセットhttp://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.htmlがpandasオブジェクトにロードできるようになりました
# note that pandas.rpy was deprecated in v0.16.0 import pandas.rpy.common as com com.load_data('Titanic')
tz_localizeは、未ローカライズデータの構造に基づいて秋の夏時間移行を推測できます(GH 4230)。ドキュメントを参照してください。DatetimeIndexはAPIドキュメントに追加されました。ドキュメントを参照してください。json_normalize()は、半構造化されたJSONデータからフラットなテーブルを作成できる新しいメソッドです。ドキュメントを参照してください(GH 1067)。qtpandas DataFrameModelとDataFrameWidgetのPySideサポートを追加しました。
Python csvパーサーがusecolsをサポートするようになりました(GH 4335)。
周波数はいくつかの新しいオフセットを獲得しました
DataFrameはSeriesと同様の新しい
interpolateメソッドを持ちます(GH 4434、GH 1892)。In [84]: df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8], ....: 'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]}) ....: In [85]: df.interpolate() Out[85]: A B 0 1.0 0.25 1 2.1 1.50 2 3.4 2.75 3 4.7 4.00 4 5.6 12.20 5 6.8 14.40
さらに、
interpolateのmethod引数は、'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', 'piecewise_polynomial', 'pchip', 'polynomial', 'spline'を含むように拡張されました。新しいメソッドにはscipyが必要です。様々なメソッドが適切である状況に関する詳細については、Scipyリファレンスガイドとドキュメントを参照してください。ドキュメントを参照してください。補間は
limitキーワード引数も受け入れるようになりました。これはfillnaのlimitと同様に機能します。In [86]: ser = pd.Series([1, 3, np.nan, np.nan, np.nan, 11]) In [87]: ser.interpolate(limit=2) Out[87]: 0 1.0 1 3.0 2 5.0 3 7.0 4 NaN 5 11.0 dtype: float64
wide_to_longパネルデータコンビニエンス関数が追加されました。ドキュメントを参照してください。In [88]: np.random.seed(123) In [89]: df = pd.DataFrame({"A1970" : {0 : "a", 1 : "b", 2 : "c"}, ....: "A1980" : {0 : "d", 1 : "e", 2 : "f"}, ....: "B1970" : {0 : 2.5, 1 : 1.2, 2 : .7}, ....: "B1980" : {0 : 3.2, 1 : 1.3, 2 : .1}, ....: "X" : dict(zip(range(3), np.random.randn(3))) ....: }) ....: In [90]: df["id"] = df.index In [91]: df Out[91]: A1970 A1980 B1970 B1980 X id 0 a d 2.5 3.2 -1.085631 0 1 b e 1.2 1.3 0.997345 1 2 c f 0.7 0.1 0.282978 2 In [92]: pd.wide_to_long(df, ["A", "B"], i="id", j="year") Out[92]: X A B id year 0 1970 -1.085631 a 2.5 1 1970 0.997345 b 1.2 2 1970 0.282978 c 0.7 0 1980 -1.085631 d 3.2 1 1980 0.997345 e 1.3 2 1980 0.282978 f 0.1
実験的#
新しい
eval()関数は、舞台裏でnumexprを使用して式評価を実装します。これにより、大規模なDataFrame/Seriesを含む複雑な式に対して大きな高速化が実現します。たとえば、In [93]: nrows, ncols = 20000, 100 In [94]: df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols)) ....: for _ in range(4)] ....:
# eval with NumExpr backend In [95]: %timeit pd.eval('df1 + df2 + df3 + df4') 4.9 ms +- 584 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
# pure Python evaluation In [96]: %timeit df1 + df2 + df3 + df4 3.35 ms +- 244 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
詳細については、ドキュメントを参照してください。
pandas.evalと同様に、DataFrameには、DataFrameのコンテキストで式を評価する新しいDataFrame.evalメソッドがあります。たとえば、In [97]: df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b']) In [98]: df.eval('a + b') Out[98]: 0 -0.685204 1 1.589745 2 0.325441 3 -1.784153 4 -0.432893 5 0.171850 6 1.895919 7 3.065587 8 -0.092759 9 1.391365 dtype: float64
query()メソッドが追加され、Pythonの構文とほぼ同じ自然なクエリ構文を使用してDataFrameの要素を選択できるようになりました。例えば、In [99]: n = 20 In [100]: df = pd.DataFrame(np.random.randint(n, size=(n, 3)), columns=['a', 'b', 'c']) In [101]: df.query('a < b < c') Out[101]: a b c 11 1 5 8 15 8 16 19
a < b < cがTrueと評価されるdfのすべての行を選択します。詳細についてはドキュメントを参照してください。pd.read_msgpack()とpd.to_msgpack()は、軽量でポータブルなバイナリ形式で任意のpandas(およびpythonオブジェクト)をシリアル化するためのサポートされているメソッドになりました。ドキュメントを参照してください。警告
これは実験的なライブラリであるため、将来のリリースまでストレージ形式は安定しない可能性があります。
df = pd.DataFrame(np.random.rand(5, 2), columns=list('AB')) df.to_msgpack('foo.msg') pd.read_msgpack('foo.msg') s = pd.Series(np.random.rand(5), index=pd.date_range('20130101', periods=5)) pd.to_msgpack('foo.msg', df, s) pd.read_msgpack('foo.msg')
iterator=Trueを渡すことで、解凍された結果をイテレートできます。for o in pd.read_msgpack('foo.msg', iterator=True): print(o)
pandas.io.gbqは、pandas DataFramesを介してGoogleのBigQueryデータセットからデータを抽出し、ロードする簡単な方法を提供します。BigQueryは高性能なSQLライクなデータベースサービスであり、非常に大規模なデータセットに対するアドホッククエリの実行に役立ちます。ドキュメントを参照してください。from pandas.io import gbq # A query to select the average monthly temperatures in the # in the year 2000 across the USA. The dataset, # publicata:samples.gsod, is available on all BigQuery accounts, # and is based on NOAA gsod data. query = """SELECT station_number as STATION, month as MONTH, AVG(mean_temp) as MEAN_TEMP FROM publicdata:samples.gsod WHERE YEAR = 2000 GROUP BY STATION, MONTH ORDER BY STATION, MONTH ASC""" # Fetch the result set for this query # Your Google BigQuery Project ID # To find this, see your dashboard: # https://console.developers.google.com/iam-admin/projects?authuser=0 projectid = 'xxxxxxxxx' df = gbq.read_gbq(query, project_id=projectid) # Use pandas to process and reshape the dataset df2 = df.pivot(index='STATION', columns='MONTH', values='MEAN_TEMP') df3 = pd.concat([df2.min(), df2.mean(), df2.max()], axis=1, keys=["Min Tem", "Mean Temp", "Max Temp"])
結果のDataFrameは
> df3 Min Tem Mean Temp Max Temp MONTH 1 -53.336667 39.827892 89.770968 2 -49.837500 43.685219 93.437932 3 -77.926087 48.708355 96.099998 4 -82.892858 55.070087 97.317240 5 -92.378261 61.428117 102.042856 6 -77.703334 65.858888 102.900000 7 -87.821428 68.169663 106.510714 8 -89.431999 68.614215 105.500000 9 -86.611112 63.436935 107.142856 10 -78.209677 56.880838 92.103333 11 -50.125000 48.861228 94.996428 12 -50.332258 42.286879 94.396774
警告
このモジュールを使用するには、BigQueryアカウントが必要です。詳細は <https://cloud.google.com/products/big-query> を参照してください。
2013年10月10日現在、GoogleのAPIには、結果セットが100,000行を超えるのを防ぐバグがあります。パッチは2013年10月14日の週に予定されています。
内部リファクタリング#
0.13.0では、主にSeriesをNDFrame(現在DataFrameとPanelの基本クラス)のサブクラスとすることで、メソッドと振る舞いを統一する大規模なリファクタリングが行われました。Seriesは以前、ndarrayから直接サブクラス化されていました。(GH 4080、GH 3862、GH 816)
警告
0.13.0以前との潜在的な非互換性が2つあります。
以前は、一部のnumpy関数に
Seriesを引数として渡すと、Seriesが返されていました。これはnp.ones_like、np.empty_like、np.diff、np.whereにのみ影響するようです。これらは現在ndarrayを返します。In [102]: s = pd.Series([1, 2, 3, 4])
Numpyの使用法
In [103]: np.ones_like(s) Out[103]: array([1, 1, 1, 1]) In [104]: np.diff(s) Out[104]: array([1, 1, 1]) In [105]: np.where(s > 1, s, np.nan) Out[105]: array([nan, 2., 3., 4.])
Pandasの使用法
In [106]: pd.Series(1, index=s.index) Out[106]: 0 1 1 1 2 1 3 1 dtype: int64 In [107]: s.diff() Out[107]: 0 NaN 1 1.0 2 1.0 3 1.0 dtype: float64 In [108]: s.where(s > 1) Out[108]: 0 NaN 1 2.0 2 3.0 3 4.0 dtype: float64
ndarray型を期待するCython関数にSeriesを直接渡すと、直接動作しなくなりました。代わりにSeries.valuesを渡す必要があります。パフォーマンスの向上を参照してください。Series(0.5)は以前はスカラ0.5を返していましたが、代わりに1要素のSeriesを返します。この変更により
rpy2<=2.3.8が壊れます。rpy2に対して問題が開かれ、回避策はGH 5698に詳細が記載されています。@JanSchulzに感謝します。
0.13以前に作成されたピックルとの互換性は維持されています。これらは
pd.read_pickleでアンピックルする必要があります。ピクル化を参照してください。series.py/frame.py/panel.pyをリファクタリングし、共通コードをgeneric.pyに移動しました。
汎用NDFrame構造を作成する
_setup_axesを追加移動したメソッド
from_axes,_wrap_array,axes,ix,loc,iloc,shape,empty,swapaxes,transpose,pop__iter__,keys,__contains__,__len__,__neg__,__invert__convert_objects,as_blocks,as_matrix,values__getstate__,__setstate__(compatはframe/panelに残ります)__getattr__,__setattr___indexed_same,reindex_like,align,where,maskfillna,replace(SeriesのreplaceはDataFrameと一貫性があります)filter(異なる軸で選択的にフィルタリングするためのaxis引数も追加)reindex,reindex_axis,taketruncate(NDFrameの一部となるように移動)
これらは、
PanelをDataFrameとより一貫性のあるものにするAPIの変更です。同じ軸が指定された
Panelでのswapaxesは、コピーを返すようになりました。設定のための属性アクセスをサポート
フィルターは、元の
DataFrameフィルターと同じAPIをサポートしています。
引数なしで呼び出されたReindexは、入力オブジェクトのコピーを返すようになりました。
TimeSeriesはSeriesのエイリアスになりました。is_time_seriesプロパティを使用して区別できます(必要に応じて)。BlockManagerを使用するためのSparseオブジェクトのリファクタリング
内部に新しいブロックタイプ
SparseBlockを作成しました。これは、複数のdtypesを保持でき、結合できません。SparseSeriesとSparseDataFrameは、その階層(Series/DataFrame)からより多くのメソッドを継承するようになり、SparseArray(これはSparseBlockのオブジェクトです)から継承しなくなりました。Sparseスイートは、非スパースデータとの統合をサポートするようになりました。非浮動小数点スパースデータはサポート可能です(部分的に実装済み)。
DataFrames内のスパース構造に対する操作はスパース性を維持するはずですが、マージタイプ操作は密(そしてスパースに戻る)に変換されるため、効率がいくらか低下する可能性があります。
ブール値/整数/スライスに対して
SparseSeriesのsetitemを有効にするSparsePanelsの実装は変更されていません(例えば、BlockManagerを使用していません、作業が必要です)。
dtypesと同様に、Series/DataFrameにftypesメソッドを追加しました。これは、基盤が疎/密であるかどうか(およびdtype)を示します。すべての
NDFrameオブジェクトは、__finalize__()を使用して、既存のオブジェクトから新しいオブジェクトに伝播するさまざまな値を指定できるようになりました(例:Seriesのnameがより自動的に追従するようになりました)。内部の型チェックは、@jtratnerの好意により、生成されたクラスのスイートを介して行われるようになり、klassを直接インポートする必要なく
isinstance(value, klass)が可能になりました。Seriesの更新におけるバグで、親フレームが変更に基づいてキャッシュを更新しない(GH 4080)またはタイプに基づいてキャッシュを更新しない(GH 3217)、fillna(GH 3386)。
Series.reindexをcore/generic.pyにリファクタリング(GH 4604、GH 4618)、Seriesでの再インデックス付けでmethod=が機能するようにしました。Series.copyはorderパラメータを受け入れなくなり、NDFrameのコピーと一貫性を持つようになりました。renameメソッドをcore/generic.pyにリファクタリング。これにより、(GH 4605)のSeries.renameが修正され、Panelに同じシグネチャを持つrenameが追加されました。clipメソッドをcore/generic.pyにリファクタリング(GH 4798)_get_numeric_data/_get_bool_dataをcore/generic.pyにリファクタリングし、Series/Panel機能に対応Series(インデックス用)/Panel(アイテム用)は、その要素への属性アクセスを許可するようになりました(GH 1903)。In [109]: s = pd.Series([1, 2, 3], index=list('abc')) In [110]: s.b Out[110]: 2 In [111]: s.a = 5 In [112]: s Out[112]: a 5 b 2 c 3 dtype: int64
バグ修正#
HDFストア異なるブロック順序で追加すると、
ValueErrorではなく無効なTypeErrorが発生する(GH 4096)read_hdfが渡されたmodeを尊重していなかった(GH 4504)0長のテーブルを追加すると正しく動作します(GH 4273)。
to_hdfは、appendとtableの両方の引数を渡すとエラーを発生させていました(GH 4584)。ストアから読み取り中に、異なるdtypeの重複する列があると例外が発生していました(GH 4767)。
列名が文字列ではない場合に
ValueErrorが正しく発生しなかったバグを修正しました(GH 4956)。固定形式で書き込まれた0長シリーズが適切に逆シリアル化されないバグ。(GH 4708)
pyt3でのデコード性能問題を修正(GH 5441)
MultiIndexに保存する前にレベルを検証する(GH 5527)
data_columnsをPanelで正しく処理する(GH 5717)。
tslib.tz_convert(vals, tz1, tz2) のバグを修正: trans[pos + 1] にアクセスしようとしたときに IndexError 例外が発生する可能性がありました (GH 4496)
*.histプロットメソッドで、by引数がlayout引数と正しく動作するようになりました(GH 4102、GH 4014)。PeriodIndex.mapでstrを使用すると、インデックスのstr表現が返されるバグを修正しました(GH 4136)。カスタムmatplotlibのデフォルトカラー使用時に
test_time_series_plot_color_with_empty_kwargsのテスト失敗を修正しました(GH 4345)。Stata IOテストの実行を修正。一時ファイルを使って書き込むようになりました(GH 4353)。
DataFrame.sumが整数値のフレームに対してDataFrame.meanよりも遅いバグを修正しました(GH 4365)。read_htmlのテストはPython 2.6で動作するようになりました(GH 4351)。networkテストでローカル変数が未定義のためNameErrorが発生していたバグを修正しました(GH 4381)。to_jsonでは、重複するインデックスのためにデータが失われる可能性があるorientが渡された場合に例外を発生させるようになりました(GH 4359)。to_jsonにおける日付処理を修正し、ドキュメント文字列に記載されているようにミリ秒がデフォルトのタイムスタンプとなるようにしました(GH 4362)。JSONのNaT処理が修正され、NaTは
nullにシリアル化されるようになりました(GH 4498)。JSONオブジェクトキー内のエスケープ可能な文字のJSON処理を修正しました(GH 4593)。
na_values=Noneの場合にkeep_default_na=Falseを渡すバグを修正しました(GH 4318)。重複する列と混合されたdtypesを持つDataFrameで
valuesがエラーを発生させるバグを修正しました。(GH 4377)read_jsonでorient='split'の場合の重複列と型変換のバグを修正しました(GH 4377)。小数点記号が「.」以外のロケールで、特定の値をエンコード/デコードする際に例外が発生するJSONバグを修正しました(GH 4918)。
PeriodIndexを使用した.iatのインデックス付けを修正しました(GH 4390)。PeriodIndexが自身と結合する際に、同じインスタンスではなく新しいインスタンスを返していたバグを修正しました(GH 4379)。また、他のインデックスタイプについてもこのテストを追加しました。usecolsパラメータ付きでCSV cparserを使用すると、すべてのdtypesがオブジェクトに変換されるバグを修正しました(GH 3192)。
ブロックのマージで、結果のDataFrameが部分的に_ref_locsを設定していたバグを修正しました(GH 4403)。
トップレベルのmatplotlib APIを使用してhistサブプロットが呼び出されたときに、それらが上書きされていた問題を修正しました(GH 4408)。
Series.astype(str)を呼び出すと文字列が切り詰められるバグを修正しました(GH 4405、GH 4437)。py3の互換性の問題を修正しました。バイトがタプルとしてrepr'dされていました(GH 4455)。
アイテムが「a」と命名された場合のパネル属性名の競合を修正しました(GH 3440)。
重複したインデックスがプロット時に例外を発生させていた問題を修正しました(GH 4486)。
cumsumとcumprodがbool dtypeで動作しなかったバグを修正しました(GH 4170、GH 4440)。
xsで誤った縮小オブジェクトを返していたPanelのスライシング問題を修正しました(GH 4016)。リサンプリングのバグを修正しました。グループが1つしかない場合にカスタムのreduce関数が使用されない問題を修正しました(GH 3849、GH 4494)。
転置されたフレームでのパネル代入を修正しました(GH 3830)。
Panelと、整列が必要な値としてのPanelによるセットインデックス付けで例外を発生させる(GH 3777)
Seriesコンストラクタでfrozensetオブジェクトが例外を発生させるようになりました(GH 4482、GH 4480)。複数のdtypeを持つ重複MultiIndexをソートする際の問題を修正しました(GH 4516)。
DataFrame.set_valuesのバグを修正しました。これは、インデックスを拡張する際に名前属性が失われる原因となっていました。(GH 3742、GH 4039)MultiIndexで個々のnames、levels、labelsが検証なしで設定できる問題を修正しました(GH 3714、GH 4039)。pivot_tableの(GH 3334)を修正。valuesがインデックスの場合、マージンが計算されませんでした。
datetimeとの演算時に
np.timedelta64またはnp.offsets.DateOffsetのrhsがある場合のバグを修正しました(GH 4532)。Series/DatetimeIndexと
np.timedelta64の算術演算が同じように動作しないバグ(GH 4134)、およびNumPy 1.6でのバグのあるtimedeltaを修正(GH 4135)。PY3を使用したWindowsでの
pd.read_clipboardのバグを修正しました(GH 4561)。デコードが正しく行われていませんでした。tslib.get_period_field()およびtslib.get_period_field_arr()は、コード引数が範囲外の場合に例外を発生させるようになりました(GH 4519、GH 4520)。空のシリーズでのブールインデックス付けでインデックス名が失われるバグを修正しました(GH 4235)。infer_dtypeは空の配列で動作します。
複数の軸を持つ再インデックス付けを修正しました。軸の一致が現在の軸を置き換えておらず、遅延周波数推論の問題につながる可能性がありました(GH 3317)。
DataFrame.applyが誤って例外を再発生させていたバグを修正しました(元のスタックトレースが切り詰められる原因となっていました)。ix/locとnon_uniqueセレクタによる選択を修正しました(GH 4619)。既存の列のdtype変更を含むiloc/locによる代入を修正しました(GH 4312、GH 5702)。core/indexingでBlock.setitemを使用するための内部setitem_with_indexerを持ちます。
csv_importで浮動小数点数に対する千単位の演算子が正しく処理されなかったバグを修正しました(GH 4322)。
CacheableOffsetが多くのDateOffsetによって適切に使用されていなかった問題を修正しました。これにより、DateOffsetのキャッシュが妨げられていました(GH 4609)。
DataFrameがlhsにあり、list/tupleがrhsにある場合のブール比較のエラーを修正しました(GH 4576)。
Series/DataFrameのNoneのsetitemにおけるエラー/dtype変換を修正しました(GH 4667)。pd.read_stataで、渡された非デフォルトエンコーディングに基づくデコードを修正しました(GH 4626)。プレーンな
ndarrayを使用したDataFrame.from_recordsの修正。(GH 4727)Index.renameおよびMultiIndex.renameなどに関するいくつかの不整合を修正。(GH 4718, GH 4628)クロスセクションおよび重複インデックスで
iloc/locを使用する際のバグ。(GH 4726)to_csvでQUOTE_NONEを使用するとExceptionが発生するバグ。(GH 4328)右辺の長さが正しくない場合でも Series インデックス付けがエラーを発生させないバグ。(GH 2702)
MultIndex の一部として部分的な文字列選択を使用した MultiIndexing のバグ。(GH 4758)
一意でないインデックスを持つインデックスでの再インデックス付けのバグが
ValueErrorを発生させるようになりました。(GH 4746)MultiIndex 軸と NumPy 配列を持つ単一のインデクサーで
loc/ixを設定する際のバグ。(GH 3777 に関連)dtypes 間で重複する列を持つ連結が axis=0 でマージされないバグ。(GH 4771, GH 4975)
スライスインデックスが失敗する
ilocのバグ。(GH 4771)read_fwfで colspecs または width がない場合の誤ったエラーメッセージ。(GH 4774)重複インデックスを持つ Series でのインデックス付けのバグを修正。(GH 4548, GH 4550)
Python 3 で
read_fwfを使用して圧縮ファイルを読み込む際のバグを修正。(GH 3963)重複インデックスと dtype 変更を伴う割り当てに関する問題を修正。(GH 4686)
Python 3 で圧縮ファイルを
strではなくbytesとして読み込む際のバグを修正。Python 3 でのバイト生成ファイル処理を簡素化。(GH 3963, GH 4785)matplotlib の異なるバージョン間での対数スケール棒グラフの ticklocs/ticklabels に関連する問題を修正。(GH 4789)
repr() によって発行される内部呼び出しに関連する DeprecationWarning を抑制。(GH 4391)
重複インデックスと
.locを使用した重複セレクターに関する問題を修正。(GH 4825)DataFrame.sort_indexで、単一の列でソートし、ascendingにリストを渡した場合、ascendingの引数がTrueと解釈されるバグを修正。(GH 4839, GH 4846)Panel.tshiftが機能しない問題を修正。Panel.shiftにfreqサポートを追加。(GH 4853)Python エンジン (つまり PythonParser) を使用した TextFileReader で thousands != “,” の問題を修正。(GH 4596)
where を使用した重複インデックスの getitem のバグ。(GH 4879)
型推論コードが float 列を datetime に強制変換する問題を修正。(GH 4601)
_ensure_numericが複素数をチェックしないバグを修正。(GH 4902)by引数が渡されたときに2つの図が作成されるSeries.histのバグを修正。(GH 4112, GH 4113)。> 2 ndims の
convert_objectsのバグを修正。(GH 4937)DataFrame/Panel キャッシュの挿入とそれに続くインデックス付けのバグを修正。(GH 4939, GH 5424)
FrozenNDArrayおよびFrozenListの文字列メソッドを修正。(GH 4929)インデックスの拡張シナリオで無効な値または範囲外の値を設定する際のバグを修正。(GH 4940)
空の Series での fillna のテスト。(GH 4346)、@immerrr さんに感謝
copy()が軸/インデックスもシャローコピーして個別のメタデータを保持するように修正。(GH 4202, GH 4830)read_csv の Python パーサーでの skiprows オプションを修正。(GH 4382)
明示的にラベルを渡さずに
np.infレベルでcutが機能しないバグを修正。(GH 3415)DatetimeIndex.unionでの重複チェックの誤りを修正。(GH 4564)csv_parser での千区切り記号と日付パーサーの間の競合を修正。(GH 4678)
dtypes が同じでない場合の追加を修正 (float/np.datetime64 の混在を示すエラー)。(GH 4993)
DateOffset の repr を修正。kwds に重複エントリが表示されなくなりました。未使用のオフセットフィールドを削除。(GH 4638)
usecols を使用した場合の read_csv 時の誤ったインデックス名を修正。C パーサーのみに適用。(GH 4201)
TimestampオブジェクトがSeriesまたはDataFrameオブジェクトとの比較演算の左辺に現れるようになりました。(GH 4982)。iloc/locを介してnp.nanでインデックス付けする際のバグを修正。(GH 5016)メモリが少ない C パーサーが同じファイルの異なるチャンクで異なる型を作成する可能性のあるバグを修正。数値型に強制変換するか、警告を発生させるようになりました。(GH 3866)
Seriesをそれ自身の形状に再整形するとTypeErrorが発生するバグ (GH 4554) とその他の再整形の問題を修正。ix/locと混合 int/string インデックスを使用した設定のバグ。(GH 4544)series-series のブール比較がラベルベースであることを確認。(GH 4947)
Timestamp 部分インデクサーを使用したマルチレベルインデックスのバグ。(GH 4294)
すべての NaN フレームの MultiIndex 構築に関するテスト/修正。(GH 4078)
read_html()がカンマを含むテーブルの値を正しく推測していなかったバグを修正。(GH 5029)read_html()が返されるテーブルの安定した順序を提供していなかったバグを修正。(GH 4770, GH 5029)。read_html()がindex_col=0を渡されたときに誤って解析していたバグを修正。(GH 5066)。read_html()がヘッダーの型を誤って推測していたバグを修正。(GH 5048)。DatetimeIndexとPeriodIndexの結合がスタックオーバーフローを引き起こしていたバグを修正。(GH 3899)。groupbyオブジェクトがプロットを許可していなかったバグを修正。(GH 5102)。groupbyオブジェクトが列名をタブ補完していなかったバグを修正。(GH 5102)。groupby.plot()とその仲間が図を複数回複製していたバグを修正。(GH 5102)。fillna での
objectdtypes の自動変換を提供。(GH 5103 に関連)オプションパーサーのクリーニングでデフォルトオプションが上書きされていたバグを修正。(GH 5121)。
リストライクな
ilocインデックス付けでリスト/ndarray を同じように扱う。(GH 5006)欠損値を持つ
MultiIndex.get_level_values()を修正。(GH 5074)datetime64 入力を持つ Timestamp() の境界チェックを修正。(GH 4065)
TestReadHtmlが正しいread_html()関数を呼び出していなかったバグを修正。(GH 5150)。NDFrame.replace()で、置換が正規表現を (誤って) 使用しているかのように見えたバグを修正。(GH 5143)。to_datetime のエラーメッセージを改善。(GH 4928)
travis-ci で異なるロケールがテストされるようにしました。(GH 4918)。また、ロケールを取得し、コンテキストマネージャーでロケールを設定するためのいくつかのユーティリティも追加されています。
isnull(MultiIndex)でのセグメンテーション違反を修正 (代わりにエラーを発生させるようになりました)。(GH 5123, GH 5125)アラインメントを行う操作で重複インデックスを許可。(GH 5185, GH 5639)
コンストラクターでの複合 dtypes が
NotImplementedErrorを発生させる。(GH 5191)重複フレームの比較のバグ。(GH 4421) に関連
重複フレームの describe のバグ
format と
coerce=Trueを使用したto_datetimeがエラーを発生させないバグ。(GH 5195)複数のインデクサーとブロードキャストが必要な Series の右辺を持つ
loc設定のバグ。(GH 5206)MultiIndexでのレベルまたはラベルのインプレース設定がキャッシュされたvaluesプロパティをクリアせず、したがって誤ったvaluesを返すバグを修正。(GH 5215)グループ化された DataFrame または Series をフィルタリングしたときに元の順序が維持されないバグを修正。(GH 4621)。
ビジネス日頻度を持つ
Periodが、非ビジネス日の場合は常に繰り上がるように修正。(GH 5203)重複する列名を持つフレームが正しく書き込まれない Excel ライターのバグを修正。(GH 5235)
Series での
dropと一意でないインデックスの問題を修正。(GH 5248)ファイル内の列数よりも多くの名前を渡すことによって引き起こされる C パーサーでのセグメンテーション違反を修正。(GH 5156)
日付/時刻のような dtypes を持つ
Series.isinを修正。(GH 5021)C および Python パーサーが、インデックス名用の行がない、より一般的な MultiIndex 列形式を処理できるようになりました。(GH 4702)
範囲外の日付をオブジェクト dtype として使用しようとするときのバグ。(GH 5312)
組み込みの PandasObject を表示しようとするときのバグ。(GH 5324)
結果が範囲外の場合、Timestamps の操作が datetime を返すことを許可するように修正。(GH 5312 に関連)
initObjToJSON()の戻り値/型シグネチャを numpy のimport_array()と互換性があるように修正。(GH 5334, GH 5326)DataFrame で名前変更後に set_index を行うときのバグ。(GH 5344)
グラフィックスのテスト時にテストスイートが一時ファイルを残さなくなりました。(GH 5347) (@yarikoptic さん、この発見に感謝します!)
win32 での HTML テストを修正。(GH 4580)
head/tailがilocベースであることを確認。(GH 5370)要素が 1 つまたは 2 つの場合の
PeriodIndex文字列表現のバグを修正。(GH 5372)GroupBy メソッド
transformおよびfilterは、繰り返された (一意でない) インデックスを持つ Series および DataFrame で使用できるようになりました。(GH 4620)空の Series が repr で名前を表示しないバグを修正。(GH 4651)
テストがデフォルトで一時ディレクトリに一時ファイルを作成するようにしました。(GH 5419)
スカラに対する
pd.to_timedeltaはスカラを返します。(GH 5410)pd.to_timedeltaはNaNおよびNaTを受け入れ、エラーを発生させる代わりにNaTを返します。(GH 5437)より大きなサイズの pandas オブジェクトでの
isnullのパフォーマンス改善インデクサーと長さが一致しない 1d ndarray を使用したさまざまな setitem のバグを修正。(GH 5508)
MultiIndex と
ilocを使用した getitem のバグ。(GH 5528)Series での delitem のバグ。(GH 5542)
カスタム関数を使用し、オブジェクトが変更されない場合の apply のバグ修正。(GH 5545)
locを使用して一意でないインデックスから選択する際のバグ。(GH 5553)ユーザー関数が
Noneを返すときに groupby が非一貫性のある型を返すバグ。(GH 5592)numpy 1.7.0 で
ndarray.itemから誤って IndexError が発生する回帰の回避策。(GH 5666)結果として一意でないインデックスを持つオブジェクトの繰り返しインデックス付けのバグ。(GH 5678)
Series と渡された series/dict を使用した fillna のバグ。(GH 5703)
datetime-like grouper を使用した groupby transform のバグ。(GH 5712)
特定のキーを使用した場合の PY3 での MultiIndex 選択のバグ。(GH 5725)
異なる dtypes の行方向の連結が特定の場合に失敗する問題。(GH 5754)
貢献者#
このリリースには合計で 77 人がパッチを提供しました。「+」が付いている人は初めてパッチを寄稿しました。
Agustín Herranz +
Alex Gaudio +
Alex Rothberg +
Andreas Klostermann +
Andreas Würl +
アンディ・ヘイデン
Ben Alex +
Benedikt Sauer +
Brad Buran
Caleb Epstein +
Chang She
クリストファー・ウィーラン
DSM +
Dale Jung +
Dan Birken
David Rasch +
Dieter Vandenbussche
Gabi Davar +
Garrett Drapala
Goyo +
Greg Reda +
Ivan Smirnov +
Jack Kelly +
Jacob Schaer +
Jan Schulz +
Jeff Tratner
Jeffrey Tratner
John McNamara +
John W. O’Brien +
Joris Van den Bossche
Justin Bozonier +
ケルシー・ジョーダル
Kevin Stone
Kieran O’Mahony
Kyle Hausmann +
Kyle Kelley +
Kyle Meyer
Mike Kelly
Mortada Mehyar +
Nick Foti +
Olivier Harris +
Ondřej Čertík +
PKEuS
Phillip Cloud
Pierre Haessig +
Richard T. Guy +
Roman Pekar +
Roy Hyunjin Han
スキッパー・シーボールド
Sten +
Thomas A Caswell +
Thomas Kluyver
Tiago Requeijo +
TomAugspurger
Trent Hauck
Valentin Haenel +
Viktor Kerkez +
Vincent Arel-Bundock
Wes McKinney
Wes Turner +
Weston Renoud +
ヤロスラフ・ハルチェンコ
Zach Dwiel +
chapman siu +
chappers +
d10genes +
danielballan
daydreamt +
engstrom +
jreback
monicaBee +
prossahl +
rockg +
unutbu +
westurner +
y-p
zach powers