バージョン 0.13.1 (2014年2月3日)#

これは 0.13.0 からのマイナーリリースで、少数のAPI変更、いくつかの新機能、機能強化、パフォーマンス改善に加え、多数のバグ修正が含まれています。すべてのユーザーにこのバージョンへのアップグレードを推奨します。

主な機能は以下の通りです。

  • 均一な形式のdatetimeの高速化を可能にするため、read_csv/to_datetimeinfer_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の変更点#

  • デフォルトのNA値のセットに -NaN-nan を追加しました (GH 5952)。NA値 を参照してください。

  • ベクトル化された文字列メソッド 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_csvpd.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=1DataFrame count/dropna

  • Series.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 が prefix kwarg を尊重するようになりました (GH 5732)。

  • 重複インデックス付き DataFrame から .ix による欠損値の選択が失敗するバグ (GH 5835)

  • 空のDataFrameでのブール比較の問題を修正 (GH 5808)

  • isnull がオブジェクト配列内の NaT を処理する際のバグ (GH 5443)

  • to_datetimenp.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_axisMultiIndex の場合でも Panel.to_frame() が失敗しなくなりました (GH 5402)。

  • pd.read_msgpackDateTimeIndex の頻度が誤って推測されるバグ (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) を参照してください。

  • timedelta dtype のマージのバグ (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)

  • to_sqlif_exists を尊重しない (GH 4110 GH 4304)

  • 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 にデータフレーム、複数の項目設定、および日付ライクな値を持つ .loc setitem インデックス付けのバグ (GH 6152)

  • 辞書式文字列比較中の query/eval のバグを修正 (GH 6155)。

  • 単一要素 Series のインデックスが捨てられていた query のバグを修正 (GH 6148)。

  • HDFStore で MultiIndexed カラムを持つデータフレームを既存のテーブルに追加する際のバグ (GH 6167)

  • 空の DataFrame を設定する際の dtype の一貫性 (GH 6171)

  • 指定された列仕様が不十分な場合でも、MultiIndex HDFStore の選択に関するバグ (GH 6169)

  • nanops.varddof=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