バージョン 0.11.0 (2013年4月22日)#

これは 0.10.1 からのメジャーリリースで、多くの新機能と機能強化に加え、多数のバグ修正が含まれています。データの選択メソッドにはかなりの追加があり、Dtype のサポートも本格的になりました。また、長年 pandas を使用しているユーザーは注意すべきいくつかの重要な API 変更点もあります。

ドキュメントに新しいセクション「10 Minutes to Pandas」が追加されました。主に新規ユーザー向けです。

ドキュメントに新しいセクション「Cookbook」が追加されました。これは pandas の便利なレシピ集です(コントリビューションも歓迎します!)。

いくつかのライブラリが推奨依存関係になりました。

選択肢#

0.11.0 より、オブジェクト選択に、より明示的な位置ベースのインデックス作成をサポートするためのユーザーからの要望による追加がいくつかありました。pandas は現在、3種類の多軸インデックス作成をサポートしています。

  • .loc は厳密にラベルベースであり、項目が見つからない場合は KeyError を発生させます。許容される入力は次のとおりです。

    • 単一のラベル。例: 5 または 'a'。(注: 5 はインデックスの*ラベル*として解釈されます。この使用方法はインデックスに沿った整数位置では**ありません**)

    • ラベルのリストまたは配列 ['a', 'b', 'c']

    • ラベル付きスライスオブジェクト 'a':'f'。(注: 通常のPythonスライスとは異なり、開始と終了の**両方**が含まれます!)

    • ブール配列

    詳細はラベルによる選択をご覧ください。

  • .iloc は厳密に整数位置ベース(軸の 0 から length-1 まで)であり、要求されたインデックスが範囲外の場合 IndexError を発生させます。許容される入力は次のとおりです。

    • 整数。例: 5

    • 整数のリストまたは配列 [4, 3, 0]

    • 整数付きスライスオブジェクト 1:7

    • ブール配列

    詳細は位置による選択をご覧ください。

  • .ix は、整数とラベルに基づいた混合アクセスをサポートします。主にラベルベースですが、整数位置アクセスにフォールバックします。.ix は最も汎用的で、.loc および .iloc へのあらゆる入力、さらに浮動小数点ラベルスキームもサポートします。.ix は、位置ベースとラベルベースの混合階層インデックスを扱う場合に特に役立ちます。

    .ix で整数スライスを使用すると、スライスが位置ベースとして解釈されるかラベルベースとして解釈されるかによって動作が異なるため、通常は .iloc または .loc を明示的に使用することをお勧めします。

    詳細は高度なインデックス作成および高度な階層をご覧ください。

選択の非推奨#

バージョン0.11.0以降、以下のメソッドは将来のバージョンで非推奨**になる可能性があります**。

  • irow

  • icol

  • iget_value

代替については、「位置による選択」のセクションを参照してください。

Dtype#

数値型dtypeはDataFrame内で伝播し、共存できます。dtypeが渡された場合(dtype キーワードを介して直接、渡された ndarray、または渡された Series を介して)、DataFrame操作で保持されます。さらに、異なる数値型dtypeは結合**されません**。以下の例でその雰囲気を掴めます。

In [1]: df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], dtype='float32')

In [2]: df1
Out[2]: 
          A
0  0.469112
1 -0.282863
2 -1.509058
3 -1.135632
4  1.212112
5 -0.173215
6  0.119209
7 -1.044236

In [3]: df1.dtypes
Out[3]: 
A    float32
dtype: object

In [4]: df2 = pd.DataFrame({'A': pd.Series(np.random.randn(8), dtype='float16'),
   ...:                     'B': pd.Series(np.random.randn(8)),
   ...:                     'C': pd.Series(range(8), dtype='uint8')})
   ...: 

In [5]: df2
Out[5]: 
          A         B  C
0 -0.861816 -0.424972  0
1 -2.105469  0.567020  1
2 -0.494873  0.276232  2
3  1.072266 -1.087401  3
4  0.721680 -0.673690  4
5 -0.706543  0.113648  5
6 -1.040039 -1.478427  6
7  0.271973  0.524988  7

In [6]: df2.dtypes
Out[6]: 
A    float16
B    float64
C      uint8
dtype: object

# here you get some upcasting
In [7]: df3 = df1.reindex_like(df2).fillna(value=0.0) + df2

In [8]: df3
Out[8]: 
          A         B    C
0 -0.392704 -0.424972  0.0
1 -2.388332  0.567020  1.0
2 -2.003932  0.276232  2.0
3 -0.063367 -1.087401  3.0
4  1.933792 -0.673690  4.0
5 -0.879758  0.113648  5.0
6 -0.920830 -1.478427  6.0
7 -0.772263  0.524988  7.0

In [9]: df3.dtypes
Out[9]: 
A    float32
B    float64
C    float64
dtype: object

Dtype変換#

これは下位互換性のある共通分母のアップキャスティングであり、すべての型に対応できるdtypeを取得します。

In [10]: df3.values.dtype
Out[10]: dtype('float64')

変換

In [11]: df3.astype('float32').dtypes
Out[11]: 
A    float32
B    float32
C    float32
dtype: object

混合変換

In [12]: df3['D'] = '1.'

In [13]: df3['E'] = '1'

In [14]: df3.convert_objects(convert_numeric=True).dtypes
Out[14]:
A    float32
B    float64
C    float64
D    float64
E      int64
dtype: object

# same, but specific dtype conversion
In [15]: df3['D'] = df3['D'].astype('float16')

In [16]: df3['E'] = df3['E'].astype('int32')

In [17]: df3.dtypes
Out[17]:
A    float32
B    float64
C    float64
D    float16
E      int32
dtype: object

日付の強制変換(および日付形式でない場合の NaT 設定)

In [18]: import datetime

In [19]: s = pd.Series([datetime.datetime(2001, 1, 1, 0, 0), 'foo', 1.0, 1,
   ....:                pd.Timestamp('20010104'), '20010105'], dtype='O')
   ....:

In [20]: s.convert_objects(convert_dates='coerce')
Out[20]:
0   2001-01-01
1          NaT
2          NaT
3          NaT
4   2001-01-04
5   2001-01-05
dtype: datetime64[ns]

Dtypeの落とし穴#

プラットフォームの落とし穴

0.11.0 以降、DataFrame/Series の構築では、*プラットフォームに関わらず*、デフォルトの dtype として int64 および float64 が使用されます。これは以前のバージョンの pandas とは明白な変更ではありません。ただし、dtype を指定した場合は、それらが尊重されます (GH 2837)。

以下のすべては int64 dtypes になります。

In [21]: pd.DataFrame([1, 2], columns=['a']).dtypes
Out[21]:
a    int64
dtype: object

In [22]: pd.DataFrame({'a': [1, 2]}).dtypes
Out[22]:
a    int64
dtype: object

In [23]: pd.DataFrame({'a': 1}, index=range(2)).dtypes
Out[23]:
a    int64
dtype: object

DataFrame(np.array([1,2])) は32ビットプラットフォームでは**必ず**int32 dtypeになりますのでご注意ください!

アップキャスティングの落とし穴

整数型データに対するインデックス操作は、データを簡単にアップキャストする可能性があります。nan が導入されない場合、入力データのdtypeは保持されます。

In [24]: dfi = df3.astype('int32')

In [25]: dfi['D'] = dfi['D'].astype('int64')

In [26]: dfi
Out[26]:
  A  B  C  D  E
0  0  0  0  1  1
1 -2  0  1  1  1
2 -2  0  2  1  1
3  0 -1  3  1  1
4  1  0  4  1  1
5  0  0  5  1  1
6  0 -1  6  1  1
7  0  0  7  1  1

In [27]: dfi.dtypes
Out[27]:
A    int32
B    int32
C    int32
D    int64
E    int32
dtype: object

In [28]: casted = dfi[dfi > 0]

In [29]: casted
Out[29]:
    A   B    C  D  E
0  NaN NaN  NaN  1  1
1  NaN NaN  1.0  1  1
2  NaN NaN  2.0  1  1
3  NaN NaN  3.0  1  1
4  1.0 NaN  4.0  1  1
5  NaN NaN  5.0  1  1
6  NaN NaN  6.0  1  1
7  NaN NaN  7.0  1  1

In [30]: casted.dtypes
Out[30]:
A    float64
B    float64
C    float64
D      int64
E      int32
dtype: object

float dtypesは変更されません。

In [31]: df4 = df3.copy()

In [32]: df4['A'] = df4['A'].astype('float32')

In [33]: df4.dtypes
Out[33]:
A    float32
B    float64
C    float64
D    float16
E      int32
dtype: object

In [34]: casted = df4[df4 > 0]

In [35]: casted
Out[35]:
          A         B    C    D  E
0       NaN       NaN  NaN  1.0  1
1       NaN  0.567020  1.0  1.0  1
2       NaN  0.276232  2.0  1.0  1
3       NaN       NaN  3.0  1.0  1
4  1.933792       NaN  4.0  1.0  1
5       NaN  0.113648  5.0  1.0  1
6       NaN       NaN  6.0  1.0  1
7       NaN  0.524988  7.0  1.0  1

In [36]: casted.dtypes
Out[36]:
A    float32
B    float64
C    float64
D    float16
E      int32
dtype: object

Datetime変換#

DataFrame (または Series) の Datetime64[ns] 列では、従来の NaT (not-a-time) に加えて、np.nan を nan 値として使用できます。これにより、一般的な方法で nan を便利に設定できます。さらに、datetimelike オブジェクトが渡された場合、デフォルトで datetime64[ns] 列が作成されます (*この変更は 0.10.1 で導入されました*) (GH 2809, GH 2810)

In [12]: df = pd.DataFrame(np.random.randn(6, 2), pd.date_range('20010102', periods=6),
   ....:                   columns=['A', ' B'])
   ....: 

In [13]: df['timestamp'] = pd.Timestamp('20010103')

In [14]: df
Out[14]: 
                   A         B  timestamp
2001-01-02  0.404705  0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 -0.370647 -1.157892 2001-01-03
2001-01-05 -1.344312  0.844885 2001-01-03
2001-01-06  1.075770 -0.109050 2001-01-03
2001-01-07  1.643563 -1.469388 2001-01-03

# datetime64[ns] out of the box
In [15]: df.dtypes.value_counts()
Out[15]: 
float64          2
datetime64[s]    1
Name: count, dtype: int64

# use the traditional nan, which is mapped to NaT internally
In [16]: df.loc[df.index[2:4], ['A', 'timestamp']] = np.nan

In [17]: df
Out[17]: 
                   A         B  timestamp
2001-01-02  0.404705  0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04       NaN -1.157892        NaT
2001-01-05       NaN  0.844885        NaT
2001-01-06  1.075770 -0.109050 2001-01-03
2001-01-07  1.643563 -1.469388 2001-01-03

datetime64[ns]object に astype 変換すると、NaT は暗黙的に np.nan に変換されます。

In [18]: import datetime

In [19]: s = pd.Series([datetime.datetime(2001, 1, 2, 0, 0) for i in range(3)])

In [20]: s.dtype
Out[20]: dtype('<M8[ns]')

In [21]: s[1] = np.nan

In [22]: s
Out[22]: 
0   2001-01-02
1          NaT
2   2001-01-02
dtype: datetime64[ns]

In [23]: s.dtype
Out[23]: dtype('<M8[ns]')

In [24]: s = s.astype('O')

In [25]: s
Out[25]: 
0    2001-01-02 00:00:00
1                    NaT
2    2001-01-02 00:00:00
dtype: object

In [26]: s.dtype
Out[26]: dtype('O')

APIの変更点#

  • インデクサーの作成を容易にするために、インデックスに to_series() メソッドが追加されました (GH 3275)。

  • HDFストア

    • テーブルから単一の列を Series として選択するメソッド select_column を追加しました。

    • unique メソッドは非推奨になりました。select_column(key,column).unique() で置き換えることができます。

    • appendmin_itemsize パラメーターは、渡されたキーに対して data_columns を自動的に作成するようになりました。

機能強化#

  • df.to_csv() のパフォーマンスが、場合によっては最大10倍向上しました。 (GH 3059)

  • Numexpr は現在、特定の種類の数値およびブール演算を高速化するための推奨依存関係です。

  • Bottleneck は現在、特定の種類の nan 演算を高速化するための推奨依存関係です。

  • HDFストア

    • read_csv/to_csv と同様の read_hdf/to_hdf API をサポートします。

      In [27]: df = pd.DataFrame({'A': range(5), 'B': range(5)})
      
      In [28]: df.to_hdf('store.h5', key='table', append=True)
      
      In [29]: pd.read_hdf('store.h5', 'table', where=['index > 2'])
      Out[29]: 
         A  B
      3  3  3
      4  4  4
      
    • ストアからの get へのドット属性アクセスを提供します。例: store.df == store['df']

    • select および select_as_multiple でのイテレーションをサポートするために、新しいキーワード iterator=boolean および chunksize=number_in_a_chunk が提供されています (GH 3076)。

  • *順序付けられていない*時系列からタイムスタンプを選択できるようになりました。これは*順序付けられた*時系列と同様です (GH 2437)。

  • 日時のようなインデックスを持つ DataFrame から文字列で選択できるようになりました。これは Series と同様です (GH 3070)。

    In [30]: idx = pd.date_range("2001-10-1", periods=5, freq='M')
    
    In [31]: ts = pd.Series(np.random.rand(len(idx)), index=idx)
    
    In [32]: ts['2001']
    Out[32]:
    2001-10-31    0.117967
    2001-11-30    0.702184
    2001-12-31    0.414034
    Freq: M, dtype: float64
    
    In [33]: df = pd.DataFrame({'A': ts})
    
    In [34]: df['2001']
    Out[34]:
                       A
    2001-10-31  0.117967
    2001-11-30  0.702184
    2001-12-31  0.414034
    
  • Squeeze はオブジェクトから長さ1の次元を削除する可能性があります。

    >>> p = pd.Panel(np.random.randn(3, 4, 4), items=['ItemA', 'ItemB', 'ItemC'],
    ...              major_axis=pd.date_range('20010102', periods=4),
    ...              minor_axis=['A', 'B', 'C', 'D'])
    >>> p
    <class 'pandas.core.panel.Panel'>
    Dimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis)
    Items axis: ItemA to ItemC
    Major_axis axis: 2001-01-02 00:00:00 to 2001-01-05 00:00:00
    Minor_axis axis: A to D
    
    >>> p.reindex(items=['ItemA']).squeeze()
                       A         B         C         D
    2001-01-02  0.926089 -2.026458  0.501277 -0.204683
    2001-01-03 -0.076524  1.081161  1.141361  0.479243
    2001-01-04  0.641817 -0.185352  1.824568  0.809152
    2001-01-05  0.575237  0.669934  1.398014 -0.399338
    
    >>> p.reindex(items=['ItemA'], minor=['B']).squeeze()
    2001-01-02   -2.026458
    2001-01-03    1.081161
    2001-01-04   -0.185352
    2001-01-05    0.669934
    Freq: D, Name: B, dtype: float64
    
  • pd.io.data.Options 内で、

    • 期限切れ後に現在の月のデータを取得しようとした際のバグを修正。

    • BeautifulSoup の代わりに lxml を使用して html をスクレイピングするようになりました (lxml の方が高速でした)。

    • コールとプットの新しいインスタンス変数は、それらを作成するメソッドが呼び出されたときに自動的に作成されます。これは現在の月に対して機能し、インスタンス変数は単に callsputs です。将来の期限切れ月に対しても機能し、インスタンス変数を callsMMYY または putsMMYY として保存します。ここで MMYY はそれぞれオプションの満期月と年です。

    • Options.get_near_stock_price は、関連するオプションデータを取得する月をユーザーが指定できるようになりました。

    • Options.get_forward_data には、オプションのキーワード引数 nearabove_below が追加されました。これにより、ユーザーは現在の株価に近いオプションの将来のデータのみを返すかどうかを指定できます。これは、Options.get_xxx_data() の代わりに Options.get_near_stock_price からデータを取得するだけです (GH 2758)。

  • 時系列プロットにカーソル座標情報が表示されるようになりました。

  • シーケンスをpprintする際に、シーケンスごとに表示される要素数を制御するオプション display.max_seq_items を追加しました。( GH 2979)

  • 小さい数値の表示を制御するオプション display.chop_threshold を追加しました。( GH 2739)

  • 100万行を超えるフレームについて verbose_info が計算されるのを防ぐため、オプション display.max_info_rows を追加しました (設定可能)。(GH 2807, GH 2918)

  • value_counts() が、正規化されたヒストグラムのための "normalize" 引数を受け入れるようになりました。(GH 2710)。

  • DataFrame.from_records は、dictだけでなく collections.Mapping ABC の任意のインスタンスを受け入れるようになりました。

  • プロットのより洗練された視覚スタイルを提供するオプション display.mpl_style を追加しました。https://gist.github.com/huyng/816622 に基づいています (GH 3075)。

  • 数値演算において、ブール値を整数(値 1 および 0)として扱います。( GH 2641)

  • to_html() は、予約済みのHTML文字エスケープを制御するためのオプションの "escape" 引数を受け入れるようになりました(デフォルトで有効)。< および > に加えて & もエスケープされます。(GH 2919)

完全なリストについては、GitHub の完全なリリースノートまたはイシュートラッカーを参照してください。

貢献者#

今回のリリースには合計50人がパッチを寄稿しました。名前に「+」が付いている人は初めてパッチを寄稿した人です。

  • アダム・グリーンホール +

  • アルバロ・テヘロ=カンテロ +

  • アンディ・ヘイデン

  • ブラッド・バーン +

  • Chang She

  • チャップマン・シウ +

  • クリス・ウィザース +

  • クリスチャン・ガイアー +

  • クリストファー・ウィーラン

  • ダミアン・ガラード

  • Dan Birken

  • ダン・デイヴィソン +

  • Dieter Vandenbussche

  • ドラゼン・ルチャニン +

  • ドラジェン・ルチャニン +

  • Garrett Drapala

  • イリア・ポロシュキン +

  • ジェームズ・キャスボン +

  • ジェフ・リーバック

  • ジェレミー・ワーグナー +

  • ジョナサン・チェンバース +

  • K.-Michael Aye

  • カーメル・アリソン +

  • ロイク・エステーブ +

  • ニコラス・E・ハレッキー +

  • ピーター・プレッテンホーファー +

  • フィリップ・クラウド +

  • ロバート・ギーゼケ +

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

  • スペンサー・ライオン

  • ステファン・リン +

  • ティエリー・モワサン +

  • Thomas Kluyver

  • ティム・アキンボ +

  • ヴィータウタス・ヤンチャウスカス

  • ヴィータウタス・ヤンチャウスカス +

  • Wes McKinney

  • ウィル・ファーナス +

  • Wouter Overmeire

  • アノムレイク +

  • デイビッドジェームスハンフリーズ +

  • デンゲマン +

  • ダイターV77 +

  • jreback

  • レクシュアル +

  • ステファンWリン +

  • タウク +

  • ヴィタス +

  • ウェイティングクオ +

  • y-p