バージョン 0.13.1 (2014年2月3日)#
これは 0.13.0 からのマイナーリリースで、少数のAPI変更、いくつかの新機能、機能強化、パフォーマンス改善に加え、多数のバグ修正が含まれています。すべてのユーザーにこのバージョンへのアップグレードを推奨します。
主な機能は以下の通りです。
均一な形式のdatetimeの高速化を可能にするため、
read_csv/to_datetimeにinfer_datetime_formatキーワードを追加しました。datetime/timedelta形式の表示精度を賢く制限するようになりました。
Panel
apply()メソッドを強化しました。新しい チュートリアル セクションに提案されたチュートリアルを追加しました。
pandasエコシステムは成長しており、新しい エコシステムページ セクションに関連プロジェクトが掲載されるようになりました。
ドキュメントの改善に多くの作業が行われ、新しい コントリビューション セクションが追加されました。
開発者のみが興味を持つかもしれませんが、新しいCIステータスページである ScatterCI が気に入っています。
警告
0.13.1 は、numpy < 1.8 と文字列のような配列に対する連鎖代入の組み合わせによって引き起こされたバグを修正します。ドキュメント を確認してください。連鎖インデックスは予期せぬ結果をもたらす可能性があり、一般的に避けるべきです。
これは以前はセグメンテーション違反を引き起こしていました。
df = pd.DataFrame({"A": np.array(["foo", "bar", "bah", "foo", "bar"])})
df["A"].iloc[0] = np.nan
この種の代入を行う推奨される方法は次のとおりです。
In [1]: df = pd.DataFrame({"A": np.array(["foo", "bar", "bah", "foo", "bar"])})
In [2]: df.loc[0, "A"] = np.nan
In [3]: df
Out[3]:
A
0 NaN
1 bar
2 bah
3 foo
4 bar
出力書式設定の強化#
df.info() ビューが列ごとに dtype 情報を表示するようになりました (GH 5682)
df.info() は、大規模なフレームの null カウントを無効にするオプション
max_info_rowsを尊重するようになりました (GH 5974)In [4]: max_info_rows = pd.get_option("max_info_rows") In [5]: df = pd.DataFrame( ...: { ...: "A": np.random.randn(10), ...: "B": np.random.randn(10), ...: "C": pd.date_range("20130101", periods=10), ...: } ...: ) ...: In [6]: df.iloc[3:6, [0, 2]] = np.nan
# set to not display the null counts In [7]: pd.set_option("max_info_rows", 0) In [8]: df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 10 entries, 0 to 9 Data columns (total 3 columns): # Column Dtype --- ------ ----- 0 A float64 1 B float64 2 C datetime64[ns] dtypes: datetime64[ns](1), float64(2) memory usage: 368.0 bytes
# this is the default (same as in 0.13.0) In [9]: pd.set_option("max_info_rows", max_info_rows) In [10]: df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 10 entries, 0 to 9 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 A 7 non-null float64 1 B 10 non-null float64 2 C 7 non-null datetime64[ns] dtypes: datetime64[ns](1), float64(2) memory usage: 368.0 bytes
新しい DataFrame repr の表示オプション
show_dimensionsを追加し、次元を表示するかどうかを制御します。In [11]: df = pd.DataFrame([[1, 2], [3, 4]]) In [12]: pd.set_option("show_dimensions", False) In [13]: df Out[13]: 0 1 0 1 2 1 3 4 In [14]: pd.set_option("show_dimensions", True) In [15]: df Out[15]: 0 1 0 1 2 1 3 4 [2 rows x 2 columns]
datetimeおよびtimedelta64用のArrayFormatterは、配列内の値に基づいて精度を賢く制限するようになりました (GH 3401)以前の出力は次のようになっていました
age today diff 0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00 1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00
現在の出力は次のようになります
In [16]: df = pd.DataFrame( ....: [pd.Timestamp("20010101"), pd.Timestamp("20040601")], columns=["age"] ....: ) ....: In [17]: df["today"] = pd.Timestamp("20130419") In [18]: df["diff"] = df["today"] - df["age"] In [19]: df Out[19]: age today diff 0 2001-01-01 2013-04-19 4491 days 1 2004-06-01 2013-04-19 3244 days [2 rows x 3 columns]
APIの変更点#
ベクトル化された文字列メソッド
Series.str.get_dummiesを追加しました (GH 6021)。これは、区切られた文字列列からダミー/インジケータ変数を抽出するためのものです。In [20]: s = pd.Series(["a", "a|b", np.nan, "a|c"]) In [21]: s.str.get_dummies(sep="|") Out[21]: a b c 0 1 0 0 1 1 1 0 2 0 0 0 3 1 0 1 [4 rows x 3 columns]
2つのNDFrameが等しい軸、dtypes、値を持つかどうかを比較する
NDFrame.equals()メソッドを追加しました。2つのndarrayが等しいかどうかを比較するarray_equivalent関数を追加しました。同一の位置にあるNaNは等しいものとして扱われます。(GH 5283) 動機となる例については、ドキュメント も参照してください。df = pd.DataFrame({"col": ["foo", 0, np.nan]}) df2 = pd.DataFrame({"col": [np.nan, 0, "foo"]}, index=[2, 1, 0]) df.equals(df2) df.equals(df2.sort_index())
DataFrame.applyは、DataFrameが空の場合にSeriesまたはDataFrameのどちらを返すかを決定するためにreduce引数を使用します (GH 6007)。以前は、空の
DataFrameに対してDataFrame.applyを呼び出すと、列がない場合はDataFrameが返されるか、適用される関数が空のSeriesで呼び出され、SeriesまたはDataFrameのどちらを返すか推測していました。In [32]: def applied_func(col): ....: print("Apply function being called with: ", col) ....: return col.sum() ....: In [33]: empty = DataFrame(columns=['a', 'b']) In [34]: empty.apply(applied_func) Apply function being called with: Series([], Length: 0, dtype: float64) Out[34]: a NaN b NaN Length: 2, dtype: float64
現在、空の
DataFrameに対してapplyが呼び出された場合:reduce引数がTrueの場合はSeriesが返され、Falseの場合はDataFrameが返され、None(デフォルト) の場合は、適用される関数が空のシリーズで呼び出され、戻り値の型を推測しようとします。In [35]: empty.apply(applied_func, reduce=True) Out[35]: a NaN b NaN Length: 2, dtype: float64 In [36]: empty.apply(applied_func, reduce=False) Out[36]: Empty DataFrame Columns: [a, b] Index: [] [0 rows x 2 columns]
以前のバージョンの非推奨/変更#
0.13.1 の時点で効力を発揮する、0.13以前の発表された変更はありません。
非推奨#
0.13.1 では、以前の動作の非推奨はありません。
機能強化#
pd.read_csvとpd.to_datetimeには、新しいinfer_datetime_formatキーワードが追加され、多くの場合で解析パフォーマンスが大幅に向上しました。提案してくださった @lexual と迅速に実装してくださった @danbirken に感謝します。(GH 5490, GH 6021)parse_datesが有効で、このフラグが設定されている場合、pandas は列内の datetime 文字列の形式を推測しようとし、推測できた場合は、より高速な解析方法に切り替えます。これにより、解析速度が約5~10倍向上する場合があります。# Try to infer the format for the index column df = pd.read_csv( "foo.csv", index_col=0, parse_dates=True, infer_datetime_format=True )
excelファイルへの書き込み時にdate_formatおよびdatetime_formatキーワードを指定できるようになりました (GH 4133)一連のイテラブルのデカルト積からMultiIndexを作成するための便利な関数
MultiIndex.from_product(GH 6055)In [22]: shades = ["light", "dark"] In [23]: colors = ["red", "green", "blue"] In [24]: pd.MultiIndex.from_product([shades, colors], names=["shade", "color"]) Out[24]: MultiIndex([('light', 'red'), ('light', 'green'), ('light', 'blue'), ( 'dark', 'red'), ( 'dark', 'green'), ( 'dark', 'blue')], names=['shade', 'color'])
Panel
apply()は非 ufunc でも動作するようになりました。ドキュメント を参照してください。In [28]: import pandas._testing as tm In [29]: panel = tm.makePanel(5) In [30]: panel Out[30]: <class 'pandas.core.panel.Panel'> Dimensions: 3 (items) x 5 (major_axis) x 4 (minor_axis) Items axis: ItemA to ItemC Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00 Minor_axis axis: A to D In [31]: panel['ItemA'] Out[31]: A B C D 2000-01-03 -0.673690 0.577046 -1.344312 -1.469388 2000-01-04 0.113648 -1.715002 0.844885 0.357021 2000-01-05 -1.478427 -1.039268 1.075770 -0.674600 2000-01-06 0.524988 -0.370647 -0.109050 -1.776904 2000-01-07 0.404705 -1.157892 1.643563 -0.968914 [5 rows x 4 columns]
シリーズ上で動作する (単一の要素を返す)
applyを指定するIn [32]: panel.apply(lambda x: x.dtype, axis='items') Out[32]: A B C D 2000-01-03 float64 float64 float64 float64 2000-01-04 float64 float64 float64 float64 2000-01-05 float64 float64 float64 float64 2000-01-06 float64 float64 float64 float64 2000-01-07 float64 float64 float64 float64 [5 rows x 4 columns]
同様の削減型操作
In [33]: panel.apply(lambda x: x.sum(), axis='major_axis') Out[33]: ItemA ItemB ItemC A -1.108775 -1.090118 -2.984435 B -3.705764 0.409204 1.866240 C 2.110856 2.960500 -0.974967 D -4.532785 0.303202 -3.685193 [4 rows x 3 columns]
これは以下と同等です
In [34]: panel.sum('major_axis') Out[34]: ItemA ItemB ItemC A -1.108775 -1.090118 -2.984435 B -3.705764 0.409204 1.866240 C 2.110856 2.960500 -0.974967 D -4.532785 0.303202 -3.685193 [4 rows x 3 columns]
Panel を返す変換操作ですが、major_axis 全体で z-score を計算しています
In [35]: result = panel.apply(lambda x: (x - x.mean()) / x.std(), ....: axis='major_axis') ....: In [36]: result Out[36]: <class 'pandas.core.panel.Panel'> Dimensions: 3 (items) x 5 (major_axis) x 4 (minor_axis) Items axis: ItemA to ItemC Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00 Minor_axis axis: A to D In [37]: result['ItemA'] # noqa E999 Out[37]: A B C D 2000-01-03 -0.535778 1.500802 -1.506416 -0.681456 2000-01-04 0.397628 -1.108752 0.360481 1.529895 2000-01-05 -1.489811 -0.339412 0.557374 0.280845 2000-01-06 0.885279 0.421830 -0.453013 -1.053785 2000-01-07 0.742682 -0.474468 1.041575 -0.075499 [5 rows x 4 columns]
断面スラブ上で動作する Panel
apply()。(GH 1148)In [38]: def f(x): ....: return ((x.T - x.mean(1)) / x.std(1)).T ....: In [39]: result = panel.apply(f, axis=['items', 'major_axis']) In [40]: result Out[40]: <class 'pandas.core.panel.Panel'> Dimensions: 4 (items) x 5 (major_axis) x 3 (minor_axis) Items axis: A to D Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00 Minor_axis axis: ItemA to ItemC In [41]: result.loc[:, :, 'ItemA'] Out[41]: A B C D 2000-01-03 0.012922 -0.030874 -0.629546 -0.757034 2000-01-04 0.392053 -1.071665 0.163228 0.548188 2000-01-05 -1.093650 -0.640898 0.385734 -1.154310 2000-01-06 1.005446 -1.154593 -0.595615 -0.809185 2000-01-07 0.783051 -0.198053 0.919339 -1.052721 [5 rows x 4 columns]
これは以下と同等です
In [42]: result = pd.Panel({ax: f(panel.loc[:, :, ax]) for ax in panel.minor_axis}) In [43]: result Out[43]: <class 'pandas.core.panel.Panel'> Dimensions: 4 (items) x 5 (major_axis) x 3 (minor_axis) Items axis: A to D Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00 Minor_axis axis: ItemA to ItemC In [44]: result.loc[:, :, 'ItemA'] Out[44]: A B C D 2000-01-03 0.012922 -0.030874 -0.629546 -0.757034 2000-01-04 0.392053 -1.071665 0.163228 0.548188 2000-01-05 -1.093650 -0.640898 0.385734 -1.154310 2000-01-06 1.005446 -1.154593 -0.595615 -0.809185 2000-01-07 0.783051 -0.198053 0.919339 -1.052721 [5 rows x 4 columns]
パフォーマンス#
0.13.1のパフォーマンス改善
Series の datetime/timedelta 二項演算 (GH 5801)
axis=1のDataFramecount/dropnaSeries.str.contains に
regex=Falseキーワードが追加され、通常の (正規表現ではない) 文字列パターンに対して高速化される場合があります。(GH 5879)Series.str.extract (GH 5944)
dtypes/ftypesメソッド (GH 5968)オブジェクト dtype を使用したインデックス付け (GH 5968)
DataFrame.apply(GH 6013)JSON IO の回帰 (GH 5765)
Series からのインデックス構築 (GH 6150)
実験的#
0.13.1 には実験的な変更はありません。
バグ修正#
io.wb.get_countriesがすべての国を含まないバグ (GH 6008)タイムスタンプ辞書による Series の置換のバグ (GH 5797)
read_csv/read_table が
prefixkwarg を尊重するようになりました (GH 5732)。重複インデックス付き DataFrame から
.ixによる欠損値の選択が失敗するバグ (GH 5835)空のDataFrameでのブール比較の問題を修正 (GH 5808)
isnull がオブジェクト配列内の
NaTを処理する際のバグ (GH 5443)to_datetimeにnp.nanまたは整数型の日付ライクな値とフォーマット文字列が渡された場合のバグ (GH 5863)datetimelike を含む groupby の dtype 変換のバグ (GH 5869)
空の Series を Series のインデクサーとして扱う場合の回帰 (GH 5877)
内部キャッシュのバグ (GH 5727) に関連
Python 3 の Windows 環境でファイルパスではない場所から JSON/msgpack を読み込む際のテストバグ (GH 5874)
.ix[tuple(…)] への代入時のバグ (GH 5896)
Panel の完全な再インデックス付けにおけるバグ (GH 5905)
オブジェクト dtype を使用した idxmin/max のバグ (GH 5914)
BusinessDayで、オフセット上にない日付に n 日を追加する際に n > 5 かつ n%5 == 0 の場合のバグ (GH 5890)ix を介してシリーズをチェーンされたシリーズに割り当てる際のバグ (GH 5928)
空の DataFrame を作成し、コピーして割り当てる際のバグ (GH 5932)
空のフレームでの DataFrame.tail のバグ (GH 5846)
resampleでメタデータを伝播する際のバグ (GH 5862)NaTの文字列表現が「NaT」になるように修正 (GH 5708)Timestamp の文字列表現が、ナノ秒が存在する場合は表示するように修正されました (GH 5912)
pd.matchが渡された番兵を返さないmajor_axisがMultiIndexの場合でもPanel.to_frame()が失敗しなくなりました (GH 5402)。pd.read_msgpackでDateTimeIndexの頻度が誤って推測されるバグ (GH 5947)タイムゾーン対応 datetime と
NaTの両方を含む配列に対するto_datetimeを修正 (GH 5961)不正なデータを持つ Series が渡された場合の rolling skew/kurtosis のバグ (GH 5749)
datetime インデックスを持つ scipy
interpolateメソッドのバグ (GH 5975)datetime/np.datetime64 が NaT と混合された状態で渡された場合の NaT 比較のバグ (GH 5968)
すべての入力が空の場合に
pd.concatが dtype 情報を失うバグを修正 (GH 5742)IPython の最近の変更により、QTConsole で以前のバージョンの pandas を使用すると警告が発せられるようになりましたが、現在は修正されています。古いバージョンを使用しており、警告を抑制する必要がある場合は、(GH 5922) を参照してください。
timedeltadtype のマージのバグ (GH 5695)plotting.scatter_matrix 関数のバグ。対角プロットと非対角プロット間の配置が間違っている問題 (GH 5497)。
ix を介した MultiIndex を持つ Series の回帰 (GH 6018)
MultiIndex を持つ Series.xs のバグ (GH 6018)
datelike と整数が混在する型で Series を作成する際のバグ (オブジェクト型になるべきで、自動変換されるべきではない) (GH 6028)
NumPy 1.7.1 でオブジェクト配列を使用してインデックスを連鎖させた場合のセグメンテーションフォールトの可能性 (GH 6026, GH 6056)
単一要素に非スカラー (例: リスト) を使用してファンシーインデックスで設定する際のバグ (GH 6043)
0.12 からの
.get(None)インデックス付けの回帰 (GH 5652)微妙な
ilocインデックス付けのバグ (GH 6059) で表面化DatetimeIndex への文字列の挿入のバグ (GH 5818)
to_html/HTML repr における Unicode バグを修正 (GH 6098)
get_options_data における引数検証の欠落を修正 (GH 6105)
DataFrame 内の重複する列への代入で、その場所がスライス (例: 隣接している) である場合のバグ (GH 6120)
重複するインデックス/列を持つ DataFrame の構築中に _ref_locs を伝播する際のバグ (GH 6121)
混在した日付ライクなリダクションを使用する際の
DataFrame.applyのバグ (GH 6125)異なる列を持つ行を追加する際の
DataFrame.appendのバグ (GH 6129)recarray と非ナノ秒 datetime dtype を使用した DataFrame 構築のバグ (GH 6140)
rhs にデータフレーム、複数の項目設定、および日付ライクな値を持つ
.locsetitem インデックス付けのバグ (GH 6152)辞書式文字列比較中の
query/evalのバグを修正 (GH 6155)。単一要素
Seriesのインデックスが捨てられていたqueryのバグを修正 (GH 6148)。HDFStore で MultiIndexed カラムを持つデータフレームを既存のテーブルに追加する際のバグ (GH 6167)
空の DataFrame を設定する際の dtype の一貫性 (GH 6171)
指定された列仕様が不十分な場合でも、MultiIndex
HDFStoreの選択に関するバグ (GH 6169)nanops.varでddof=1と 1 要素の場合、一部のプラットフォームでnanではなくinfが返される場合があったバグ (GH 6136)Series および DataFrame の棒グラフが
use_indexキーワードを無視するバグ (GH 6209)python3 で混在した str/int を使用した groupby のバグを修正。
argsortが失敗していました (GH 6212)
貢献者#
このリリースには合計52人がパッチを寄稿しました。「+」が付いている人は初めてパッチを寄稿しました。
アレックス・ロスバーグ
Alok Singhal +
Andrew Burrows +
アンディ・ヘイデン
Bjorn Arneson +
Brad Buran
Caleb Epstein
Chapman Siu
Chase Albert +
Clark Fitzgerald +
DSM
Dan Birken
Daniel Waeber +
David Wolever +
Doran Deluz +
Douglas McNeil +
Douglas Rudd +
Draž̌en Lučanin
Elliot S +
Felix Lawrence +
George Kuan +
Guillaume Gay +
ジェイコブ・シャアー
Jan Wagner +
Jeff Tratner
John McNamara
Joris Van den Bossche
Julia Evans +
Kieran O’Mahony
Michael Schatzow +
Naveen Michaud-Agrawal +
Patrick O’Keeffe +
Phillip Cloud
Roman Pekar
スキッパー・シーボールド
Spencer Lyon
Tom Augspurger +
TomAugspurger
acorbe +
akittredge +
bmu +
bwignall +
chapman siu
danielballan
david +
davidshinn
immerrr +
jreback
レクシュアル
mwaskom +
unutbu
y-p