バージョン 0.14.0 (2014年5月31日)#

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

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

    • Python 3.4を正式にサポート

    • SQLインターフェースがsqlalchemyを使用するように更新されました。詳細はこちらを参照してください。

    • 表示インターフェースの変更。詳細はこちら

    • スライサーを使用したMultiIndexing。詳細はこちらを参照してください。

    • 単一インデックスのDataFrameとMultiIndexed DataFrameを結合する機能。詳細はこちらを参照してください

    • groupbyの結果の一貫性が向上し、より柔軟なgroupbyの指定が可能になりました。詳細はこちらを参照してください。

    • 祝日カレンダーがCustomBusinessDayでサポートされるようになりました。詳細はこちらを参照してください。

    • プロット機能にいくつかの改善が加えられました。hexbin、area、pieプロットなどです。詳細はこちらを参照してください。

    • I/O操作に関するパフォーマンスドキュメントセクション。詳細はこちらを参照してください。

  • その他の機能強化

  • APIの変更点

  • テキスト解析APIの変更

  • Groupby APIの変更

  • パフォーマンス改善

  • 以前の非推奨事項

  • 非推奨

  • 既知の問題

  • バグ修正

警告

0.14.0では、すべてのNDFrameベースのコンテナが大幅な内部リファクタリングを受けました。以前は、同種のデータブロックごとに独自のラベルがあり、それらを親コンテナのラベルと同期させるには特別な注意が必要でした。これにより、ユーザー/APIの動作に目に見える変更はありません(GH 6745)。

APIの変更点#

  • read_excelはデフォルトシートとして0を使用します(GH 6573

  • ilocはスライスに対して範囲外のインデクサーを受け入れるようになりました。たとえば、インデックス付けされるオブジェクトの長さを超える値です。これらは除外されます。これにより、pandasはPython/NumPyの範囲外の値のインデックス付けにさらに適合します。範囲外の単一のインデクサーでオブジェクトの次元が削除される場合は、引き続きIndexErrorが発生します(GH 6296GH 6299)。これにより、空の軸(たとえば、空のDataFrameが返される)になる可能性があります。

    In [1]: dfl = pd.DataFrame(np.random.randn(5, 2), columns=list('AB'))
    
    In [2]: dfl
    Out[2]: 
              A         B
    0  0.469112 -0.282863
    1 -1.509059 -1.135632
    2  1.212112 -0.173215
    3  0.119209 -1.044236
    4 -0.861849 -2.104569
    
    [5 rows x 2 columns]
    
    In [3]: dfl.iloc[:, 2:3]
    Out[3]: 
    Empty DataFrame
    Columns: []
    Index: [0, 1, 2, 3, 4]
    
    [5 rows x 0 columns]
    
    In [4]: dfl.iloc[:, 1:3]
    Out[4]: 
              B
    0 -0.282863
    1 -1.135632
    2 -0.173215
    3 -1.044236
    4 -2.104569
    
    [5 rows x 1 columns]
    
    In [5]: dfl.iloc[4:6]
    Out[5]: 
              A         B
    4 -0.861849 -2.104569
    
    [1 rows x 2 columns]
    

    これらは範囲外の選択です

    >>> dfl.iloc[[4, 5, 6]]
    IndexError: positional indexers are out-of-bounds
    
    >>> dfl.iloc[:, 4]
    IndexError: single positional indexer is out-of-bounds
    
  • 負の開始値、終了値、ステップ値を持つスライスがコーナーケースをより良く処理します(GH 6531)。

    • df.iloc[:-len(df)]は現在空です

    • df.iloc[len(df)::-1]はすべての要素を逆順で列挙するようになりました

  • DataFrame.interpolate()キーワードdowncastのデフォルトがinferからNoneに変更されました。これは、明示的に要求されない限り元のdtypeを保持するためです(GH 6290)。

  • データフレームをHTMLに変換する際、以前はEmpty DataFrameが返されていました。この特殊なケースは削除され、代わりに列名を持つヘッダーが返されるようになりました(GH 6062)。

  • SeriesIndexは、内部でより多くの共通操作を共有するようになりました。例えば、factorize(),nunique(),value_counts()Index型でもサポートされるようになりました。Series.weekdayプロパティはAPIの一貫性のためにSeriesから削除されました。DatetimeIndex/PeriodIndexメソッドをSeriesで使用すると、TypeErrorが発生するようになりました。(GH 4551GH 4056GH 5519GH 6380GH 7206)。

  • DateTimeIndex / Timestampis_month_startis_month_endis_quarter_startis_quarter_endis_year_startis_year_endアクセサーを追加。これらはタイムスタンプがDateTimeIndex / Timestampの頻度で定義された月/四半期/年の開始/終了であるかどうかを示すブール配列を返します(GH 4565GH 6998)。

  • pandas.eval()/DataFrame.eval()/DataFrame.query()でのローカル変数の使用法が変更されました(GH 5987)。DataFrameメソッドでは、2つの変更がありました。

    • 列名がローカル変数よりも優先されるようになりました

    • ローカル変数は明示的に参照する必要があります。つまり、列ではないローカル変数がある場合でも、'@'プレフィックスを使用して参照する必要があります。

    • pandasが名前aの曖昧さについて文句を言うことなく、df.query('@a < a')のような式を持つことができます。

    • トップレベルのpandas.eval()関数では、'@'プレフィックスを使用することはできません。使用しようとするとエラーメッセージが表示されます。

    • NameResolutionErrorは不要になったため削除されました。

  • query/evalでの列名とインデックス名の順序を定義し、文書化する(GH 6676

  • concatは、必要に応じてシリーズ名または列の番号付けを使用して、混合されたSeriesとDataFrameを結合するようになりました(GH 2385)。詳細はドキュメントを参照してください。

  • IndexクラスおよびIndex.delete()Index.drop()メソッドでのスライスおよび高度な/ブールインデックス操作は、結果のインデックスの型を変更しなくなりました(GH 6440GH 7040)。

    In [6]: i = pd.Index([1, 2, 3, 'a', 'b', 'c'])
    
    In [7]: i[[0, 1, 2]]
    Out[7]: Index([1, 2, 3], dtype='object')
    
    In [8]: i.drop(['a', 'b', 'c'])
    Out[8]: Index([1, 2, 3], dtype='object')
    

    以前は、上記の操作はInt64Indexを返していました。手動で行いたい場合は、Index.astype()を使用してください。

    In [9]: i[[0, 1, 2]].astype(np.int_)
    Out[9]: Index([1, 2, 3], dtype='int64')
    
  • set_indexは、MultiIndexesをタプルのIndexに変換しなくなりました。例えば、古い動作ではこのケースでIndexが返されていました(GH 6459)。

    # Old behavior, casted MultiIndex to an Index
    In [10]: tuple_ind
    Out[10]: Index([('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')], dtype='object')
    
    In [11]: df_multi.set_index(tuple_ind)
    Out[11]: 
                   0         1
    (a, c)  0.471435 -1.190976
    (a, d)  1.432707 -0.312652
    (b, c) -0.720589  0.887163
    (b, d)  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
    # New behavior
    In [12]: mi
    Out[12]: 
    MultiIndex([('a', 'c'),
                ('a', 'd'),
                ('b', 'c'),
                ('b', 'd')],
               )
    
    In [13]: df_multi.set_index(mi)
    Out[13]: 
                0         1
    a c  0.471435 -1.190976
      d  1.432707 -0.312652
    b c -0.720589  0.887163
      d  0.859588 -0.636524
    
    [4 rows x 2 columns]
    

    これは、複数のインデックスをset_indexに渡す場合にも適用されます。

    # Old output, 2-level MultiIndex of tuples
    In [14]: df_multi.set_index([df_multi.index, df_multi.index])
    Out[14]: 
                          0         1
    (a, c) (a, c)  0.471435 -1.190976
    (a, d) (a, d)  1.432707 -0.312652
    (b, c) (b, c) -0.720589  0.887163
    (b, d) (b, d)  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
    # New output, 4-level MultiIndex
    In [15]: df_multi.set_index([df_multi.index, df_multi.index])
    Out[15]: 
                    0         1
    a c a c  0.471435 -1.190976
      d a d  1.432707 -0.312652
    b c b c -0.720589  0.887163
      d b d  0.859588 -0.636524
    
    [4 rows x 2 columns]
    
  • 統計モーメント関数rolling_covrolling_correwmcovewmcorrexpanding_covexpanding_corrpairwiseキーワードが追加され、移動窓共分散および相関行列の計算が可能になりました(GH 4950)。詳細はドキュメントの移動窓ペアワイズ共分散と相関の計算を参照してください。

    In [1]: df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))
    
    In [4]: covs = pd.rolling_cov(df[['A', 'B', 'C']],
      ....:                       df[['B', 'C', 'D']],
      ....:                       5,
      ....:                       pairwise=True)
    
    
    In [5]: covs[df.index[-1]]
    Out[5]:
              B         C         D
    A  0.035310  0.326593 -0.505430
    B  0.137748 -0.006888 -0.005383
    C -0.006888  0.861040  0.020762
    
  • Series.iteritems()は遅延評価されるようになりました(リストではなくイテレータを返します)。これは0.14以前の文書化された動作でした。(GH 6760

  • Indexに一意の要素を数えるためのnuniqueおよびvalue_counts関数を追加しました。(GH 6734

  • stackおよびunstackは、levelキーワードがIndex内の非一意の項目を参照する場合にValueErrorを発生させるようになりました(以前はKeyErrorを発生させていました)。 (GH 6738)

  • Series.sortから未使用のorder引数を削除; argsはSeries.orderと同じ順序になりました; Series.orderに準拠するためにna_position引数を追加(GH 6847

  • Series.orderのデフォルトのソートアルゴリズムは、Series.sort(およびnumpyのデフォルト)に準拠するようにquicksortになりました。

  • Series.order/sortinplaceキーワードを追加して、逆操作にする(GH 6859

  • DataFrame.sortは、na_positionパラメータに従ってNaNsをソートの最初または最後に配置するようになりました。(GH 3917

  • concatTextFileReaderを受け入れるようになりました。これは一般的なユーザーの慣用表現に影響を与えていました(GH 6583)。これは0.13.1からの回帰でした。

  • IndexSeriesにインデクサーと一意の値を取得するためのfactorize関数を追加しました(GH 7090)。

  • Timestampと文字列のようなオブジェクトが混在するDataFrameに対するdescribeは、異なるIndexを返します(GH 7088)。以前は、インデックスは意図せずソートされていました。

  • bool dtypeのみの算術演算は、+-*操作ではPython空間で評価され、それ以外ではエラーが発生するという警告を出すようになりました(GH 7011GH 6762GH 7015GH 7210)。

    >>> x = pd.Series(np.random.rand(10) > 0.5)
    >>> y = True
    >>> x + y  # warning generated: should do x | y instead
    UserWarning: evaluating in Python space because the '+' operator is not
    supported by numexpr for the bool dtype, use '|' instead
    >>> x / y  # this raises because it doesn't make sense
    NotImplementedError: operator '/' not implemented for bool dtypes
    
  • HDFStoreでは、キーまたはセレクターが見つからない場合、select_as_multipleは常にKeyErrorを発生させます(GH 6177)。

  • df['col'] = valuedf.loc[:,'col'] = valueは完全に同等になりました。以前は、.locは結果のシリーズのdtypeを強制的に変換するとは限りませんでした(GH 6149)。

  • dtypesftypesは、空のコンテナではdtype=objectのシリーズを返すようになりました(GH 5740)。

  • df.to_csvは、ターゲットパスもバッファも提供されていない場合、CSVデータの文字列を返すようになりました(GH 6061)。

  • pd.infer_freq()は、無効なSeries/Index型が与えられた場合にTypeErrorを発生させるようになりました(GH 6407GH 6463)。

  • DataFame.sort_indexに渡されたタプルは、タプルのリストを必要とするのではなく、インデックスのレベルとして解釈されるようになりました(GH 4370)。

  • すべてのオフセット操作は、Timestamp型を返すようになりました(datetimeではなく)、Business/Weekの頻度が正しくありませんでした(GH 4069)。

  • to_excelは、np.infを文字列表現に変換するようになりました。これはinf_repキーワード引数でカスタマイズ可能です(Excelにはネイティブの無限大表現がありません)(GH 6782)。

  • pandas.compat.scipy.scoreatpercentilenumpy.percentileに置き換える(GH 6810

  • datetime[ns]シリーズでの.quantileは、np.datetime64オブジェクトではなくTimestampを返すようになりました(GH 6810)。

  • concatに無効な型が渡された場合、AssertionErrorTypeErrorに変更(GH 6583

  • DataFramedata引数としてイテレータが渡された場合、TypeErrorを発生させる(GH 5357

表示の変更#

  • 大規模なDataFrameのデフォルトの表示方法が変更されました。max_rowsおよび/またはmax_columnsを超えるDataFrameは、pandas.Seriesの表示と一貫性のある、中央で切り詰められたビューで表示されるようになりました(GH 5603)。

    以前のバージョンでは、DataFrameは次元の制約に達すると切り詰められ、省略記号(…)がデータの一部が切り捨てられたことを示していました。

    The previous look of truncate.

    現在のバージョンでは、大きなDataFrameは中央で切り詰められ、両方の次元で先頭と末尾のプレビューが表示されます。

    The new look.
  • フレームが切り詰められている場合にのみ寸法を表示するdisplay.show_dimensionsのオプション'truncate'を許可する(GH 6547)。

    display.show_dimensionsのデフォルトはtruncateになりました。これはSeriesの表示長と一貫しています。

    In [16]: dfd = pd.DataFrame(np.arange(25).reshape(-1, 5),
       ....:                    index=[0, 1, 2, 3, 4],
       ....:                    columns=[0, 1, 2, 3, 4])
       ....: 
    
    # show dimensions since this is truncated
    In [17]: with pd.option_context('display.max_rows', 2, 'display.max_columns', 2,
       ....:                        'display.show_dimensions', 'truncate'):
       ....:     print(dfd)
       ....: 
         0  ...   4
    0    0  ...   4
    ..  ..  ...  ..
    4   20  ...  24
    
    [5 rows x 5 columns]
    
    # will not show dimensions since it is not truncated
    In [18]: with pd.option_context('display.max_rows', 10, 'display.max_columns', 40,
       ....:                        'display.show_dimensions', 'truncate'):
       ....:     print(dfd)
       ....: 
        0   1   2   3   4
    0   0   1   2   3   4
    1   5   6   7   8   9
    2  10  11  12  13  14
    3  15  16  17  18  19
    4  20  21  22  23  24
    
  • display.max_rowsがシリーズの長さよりも短い場合のMultiIndexed Seriesの表示における回帰(GH 7101)。

  • 切り詰められたSeriesまたはDataFrameのHTML表現で、large_reprが「info」に設定されている場合にクラス名が表示されないバグを修正しました(GH 7105)。

  • DataFrame.info()verboseキーワードは、info表現を短縮するかどうかを制御しますが、デフォルトでNoneになりました。これはdisplay.max_info_columnsのグローバル設定に従います。グローバル設定はverbose=Trueまたはverbose=Falseで上書きできます。

  • info表現がdisplay.max_info_columns設定を尊重しないバグを修正しました(GH 6939)。

  • Timestamp __repr__にオフセット/頻度情報が追加されました(GH 4553)。

テキスト解析APIの変更#

read_csv()/read_table()は、無効なオプションに対して、PythonParserにフォールバックするのではなく、より多くの警告を発するようになりました。

  • read_csv()/read_table()delim_whitespace=Trueとともにsepが指定された場合、ValueErrorを発生させる(GH 6607

  • read_csv()/read_table()でサポートされていないオプションとともにengine='c'が指定された場合、ValueErrorを発生させる(GH 6607

  • Pythonパーサーへのフォールバックによってオプションが無視される場合にValueErrorを発生させる(GH 6607

  • オプションが無視されない場合にPythonパーサーにフォールバックする際、ParserWarningを生成する(GH 6607

  • 他のC言語非対応オプションが指定されていない場合、read_csv()/read_table()sep='\s+'delim_whitespace=Trueに変換する(GH 6607

GroupBy APIの変更#

一部のgroupbyメソッドの動作がより一貫性を持つようになりました

  • groupbyのheadおよびtailは、集約ではなくfilterのような動作をするようになりました

    In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B'])
    
    In [2]: g = df.groupby('A')
    
    In [3]: g.head(1)  # filters DataFrame
    Out[3]:
       A  B
    0  1  2
    2  5  6
    
    In [4]: g.apply(lambda x: x.head(1))  # used to simply fall-through
    Out[4]:
         A  B
    A
    1 0  1  2
    5 2  5  6
    
  • groupby headとtailは列選択を尊重します

    In [19]: g[['B']].head(1)
    Out[19]:
       B
    0  2
    2  6
    
    [2 rows x 1 columns]
    
  • groupby nthはデフォルトで縮小されるようになりました。as_index=Falseを渡すことでフィルタリングを実現できます。NaNを無視するオプションのdropna引数も利用できます。詳細はドキュメントを参照してください。

    削減

    In [19]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6]], columns=['A', 'B'])
    
    In [20]: g = df.groupby('A')
    
    In [21]: g.nth(0)
    Out[21]: 
       A    B
    0  1  NaN
    2  5  6.0
    
    [2 rows x 2 columns]
    
    # this is equivalent to g.first()
    In [22]: g.nth(0, dropna='any')
    Out[22]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    
    # this is equivalent to g.last()
    In [23]: g.nth(-1, dropna='any')
    Out[23]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    

    フィルタリング

    In [24]: gf = df.groupby('A', as_index=False)
    
    In [25]: gf.nth(0)
    Out[25]: 
       A    B
    0  1  NaN
    2  5  6.0
    
    [2 rows x 2 columns]
    
    In [26]: gf.nth(0, dropna='any')
    Out[26]: 
       A    B
    1  1  4.0
    2  5  6.0
    
    [2 rows x 2 columns]
    
  • groupbyは、Cython関数ではない場合、グループ化された列を返さなくなります(GH 5610GH 5614GH 6732)。これはすでにインデックスであるためです。

    In [27]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6], [5, 8]], columns=['A', 'B'])
    
    In [28]: g = df.groupby('A')
    
    In [29]: g.count()
    Out[29]: 
       B
    A   
    1  1
    5  2
    
    [2 rows x 1 columns]
    
    In [30]: g.describe()
    Out[30]: 
          B                                        
      count mean       std  min  25%  50%  75%  max
    A                                              
    1   1.0  4.0       NaN  4.0  4.0  4.0  4.0  4.0
    5   2.0  7.0  1.414214  6.0  6.5  7.0  7.5  8.0
    
    [2 rows x 8 columns]
    
  • as_indexを渡すと、グループ化された列はそのまま残ります(これは0.14.0では変更されていません)。

    In [31]: df = pd.DataFrame([[1, np.nan], [1, 4], [5, 6], [5, 8]], columns=['A', 'B'])
    
    In [32]: g = df.groupby('A', as_index=False)
    
    In [33]: g.count()
    Out[33]: 
       A  B
    0  1  1
    1  5  2
    
    [2 rows x 2 columns]
    
    In [34]: g.describe()
    Out[34]: 
       A     B                                        
         count mean       std  min  25%  50%  75%  max
    0  1   1.0  4.0       NaN  4.0  4.0  4.0  4.0  4.0
    1  5   2.0  7.0  1.414214  6.0  6.5  7.0  7.5  8.0
    
    [2 rows x 9 columns]
    
  • pd.Grouperを介して、より複雑なgroupby(時刻と文字列フィールドを同時にグループ化するなど)を指定できるようになりました。詳細はドキュメントを参照してください。(GH 3794

  • groupby操作を実行する際のSeries名の伝播/保持の改善

    • SeriesGroupBy.aggは、元のシリーズの名前属性が結果に伝播されることを保証します(GH 6265)。

    • GroupBy.applyに提供された関数が名前付きシリーズを返す場合、そのシリーズの名前はGroupBy.applyによって返されるDataFrameの列インデックスの名前として保持されます(GH 6124)。これにより、列インデックスの名前がピボットされたデータを含む挿入された列の名前として使用されるDataFrame.stack操作が容易になります。

SQL#

SQLの読み書き関数は、SQLAlchemyを介してより多くのデータベースフレーバーをサポートするようになりました(GH 2717GH 4163GH 5950GH 6292)。SQLAlchemyがサポートするすべてのデータベース(PostgreSQL、MySQL、Oracle、Microsoft SQL Serverなど)が使用できます(SQLAlchemyの含まれるダイアレクトに関するドキュメントを参照)。

DBAPI接続オブジェクトを提供する機能は、将来的にはsqlite3のみでサポートされます。'mysql'フレーバーは非推奨です。

新しい関数read_sql_query()read_sql_table()が導入されました。read_sql()関数は、他の2つの便利なラッパーとして維持され、提供された入力(データベーステーブル名またはSQLクエリ)に応じて特定の関数に委譲します。

実際には、SQL関数にSQLAlchemyのengineを提供する必要があります。SQLAlchemyで接続するには、create_engine()関数を使用してデータベースURIからエンジンオブジェクトを作成します。接続するデータベースごとにエンジンを作成する必要があるのは1回だけです。インメモリのsqliteデータベースの場合

In [35]: from sqlalchemy import create_engine

# Create your connection.
In [36]: engine = create_engine('sqlite:///:memory:')

このengineは、このデータベースへのデータ書き込みまたは読み取りに使用できます。

In [37]: df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})

In [38]: df.to_sql(name='db_table', con=engine, index=False)
Out[38]: 3

テーブル名を指定してデータベースからデータを読み取ることができます。

In [39]: pd.read_sql_table('db_table', engine)
Out[39]: 
   A  B
0  1  a
1  2  b
2  3  c

[3 rows x 2 columns]

またはSQLクエリを指定する

In [40]: pd.read_sql_query('SELECT * FROM db_table', engine)
Out[40]: 
   A  B
0  1  a
1  2  b
2  3  c

[3 rows x 2 columns]

SQL関数へのその他の機能強化には以下が含まれます。

  • インデックス書き込みのサポート。これはindexキーワード(デフォルトはTrue)で制御できます。

  • インデックスを書き込む際に使用する列ラベルをindex_labelで指定します。

  • read_sql_query()およびread_sql_table()parse_datesキーワードを使用して、datetimeとして解析する文字列列を指定します。

警告

既存の関数または関数エイリアスの一部は非推奨となり、将来のバージョンで削除されます。これには、tqueryuqueryread_frameframe_querywrite_frameが含まれます。

警告

DBAPI接続オブジェクトを使用する際の「mysql」フレーバーのサポートは非推奨となりました。MySQLは引き続きSQLAlchemyエンジンでサポートされます(GH 6900)。

スライサーを使用したマルチインデックス#

0.14.0では、MultiIndexedオブジェクトをスライスする新しい方法を追加しました。複数のインデクサーを提供することで、MultiIndexをスライスできます。

スライス、ラベルのリスト、ラベル、ブールインデクサーなど、ラベルによる選択と同様に、任意のセレクターを提供できます。

slice(None) を使用して、そのレベルのすべての内容を選択できます。より深いレベルをすべて指定する必要はありません。slice(None) として暗黙的に指定されます。

いつものように、これはラベルインデックス付けであるため、スライサーの両側が含まれます。

詳細はドキュメントを参照してください。また、以下の問題も参照してください(GH 6134GH 4036GH 3057GH 2598GH 5641GH 7106)。

警告

.loc指定子ではすべての軸を指定する必要があります。つまり、インデックスの両方のインデクサーを指定します。渡されたインデクサーが、行のMultiIndexではなく、*両方*の軸をインデックス付けしていると誤解される可能性がある曖昧なケースがいくつかあります。

このようにすべきです

  >>> df.loc[(slice('A1', 'A3'), ...), :]  # noqa: E901

rather than this:
>>> df.loc[(slice('A1', 'A3'), ...)]  # noqa: E901

警告

選択軸が完全に辞書順にソートされていることを確認する必要があります!

In [41]: def mklbl(prefix, n):
   ....:     return ["%s%s" % (prefix, i) for i in range(n)]
   ....: 

In [42]: index = pd.MultiIndex.from_product([mklbl('A', 4),
   ....:                                     mklbl('B', 2),
   ....:                                     mklbl('C', 4),
   ....:                                     mklbl('D', 2)])
   ....: 

In [43]: columns = pd.MultiIndex.from_tuples([('a', 'foo'), ('a', 'bar'),
   ....:                                      ('b', 'foo'), ('b', 'bah')],
   ....:                                     names=['lvl0', 'lvl1'])
   ....: 

In [44]: df = pd.DataFrame(np.arange(len(index) * len(columns)).reshape((len(index),
   ....:                   len(columns))),
   ....:                   index=index,
   ....:                   columns=columns).sort_index().sort_index(axis=1)
   ....: 

In [45]: df
Out[45]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0    9    8   11   10
         D1   13   12   15   14
      C2 D0   17   16   19   18
...          ...  ...  ...  ...
A3 B1 C1 D1  237  236  239  238
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  249  248  251  250
         D1  253  252  255  254

[64 rows x 4 columns]

スライス、リスト、およびラベルを使用した基本的なMultiIndexスライシング。

In [46]: df.loc[(slice('A1', 'A3'), slice(None), ['C1', 'C3']), :]
Out[46]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A1 B0 C1 D0   73   72   75   74
         D1   77   76   79   78
      C3 D0   89   88   91   90
         D1   93   92   95   94
   B1 C1 D0  105  104  107  106
...          ...  ...  ...  ...
A3 B0 C3 D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

[24 rows x 4 columns]

pd.IndexSliceを使用して、これらのスライスの作成を省略できます。

In [47]: idx = pd.IndexSlice

In [48]: df.loc[idx[:, :, ['C1', 'C3']], idx[:, 'foo']]
Out[48]: 
lvl0           a    b
lvl1         foo  foo
A0 B0 C1 D0    8   10
         D1   12   14
      C3 D0   24   26
         D1   28   30
   B1 C1 D0   40   42
...          ...  ...
A3 B0 C3 D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[32 rows x 2 columns]

この方法を使用すると、複数の軸に対して同時に非常に複雑な選択を実行できます。

In [49]: df.loc['A1', (slice(None), 'foo')]
Out[49]: 
lvl0        a    b
lvl1      foo  foo
B0 C0 D0   64   66
      D1   68   70
   C1 D0   72   74
      D1   76   78
   C2 D0   80   82
...       ...  ...
B1 C1 D1  108  110
   C2 D0  112  114
      D1  116  118
   C3 D0  120  122
      D1  124  126

[16 rows x 2 columns]

In [50]: df.loc[idx[:, :, ['C1', 'C3']], idx[:, 'foo']]
Out[50]: 
lvl0           a    b
lvl1         foo  foo
A0 B0 C1 D0    8   10
         D1   12   14
      C3 D0   24   26
         D1   28   30
   B1 C1 D0   40   42
...          ...  ...
A3 B0 C3 D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[32 rows x 2 columns]

ブールインデクサーを使用すると、に関連する選択を提供できます。

In [51]: mask = df[('a', 'foo')] > 200

In [52]: df.loc[idx[mask, :, ['C1', 'C3']], idx[:, 'foo']]
Out[52]: 
lvl0           a    b
lvl1         foo  foo
A3 B0 C1 D1  204  206
      C3 D0  216  218
         D1  220  222
   B1 C1 D0  232  234
         D1  236  238
      C3 D0  248  250
         D1  252  254

[7 rows x 2 columns]

.locaxis引数を指定して、渡されたスライサーを単一軸で解釈することもできます。

In [53]: df.loc(axis=0)[:, :, ['C1', 'C3']]
Out[53]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C1 D0    9    8   11   10
         D1   13   12   15   14
      C3 D0   25   24   27   26
         D1   29   28   31   30
   B1 C1 D0   41   40   43   42
...          ...  ...  ...  ...
A3 B0 C3 D1  221  220  223  222
   B1 C1 D0  233  232  235  234
         D1  237  236  239  238
      C3 D0  249  248  251  250
         D1  253  252  255  254

[32 rows x 4 columns]

さらに、これらのメソッドを使用して値を設定できます。

In [54]: df2 = df.copy()

In [55]: df2.loc(axis=0)[:, :, ['C1', 'C3']] = -10

In [56]: df2
Out[56]: 
lvl0           a         b     
lvl1         bar  foo  bah  foo
A0 B0 C0 D0    1    0    3    2
         D1    5    4    7    6
      C1 D0  -10  -10  -10  -10
         D1  -10  -10  -10  -10
      C2 D0   17   16   19   18
...          ...  ...  ...  ...
A3 B1 C1 D1  -10  -10  -10  -10
      C2 D0  241  240  243  242
         D1  245  244  247  246
      C3 D0  -10  -10  -10  -10
         D1  -10  -10  -10  -10

[64 rows x 4 columns]

アライン可能なオブジェクトの右側を使用することもできます。

In [57]: df2 = df.copy()

In [58]: df2.loc[idx[:, :, ['C1', 'C3']], :] = df2 * 1000

In [59]: df2
Out[59]: 
lvl0              a               b        
lvl1            bar     foo     bah     foo
A0 B0 C0 D0       1       0       3       2
         D1       5       4       7       6
      C1 D0    9000    8000   11000   10000
         D1   13000   12000   15000   14000
      C2 D0      17      16      19      18
...             ...     ...     ...     ...
A3 B1 C1 D1  237000  236000  239000  238000
      C2 D0     241     240     243     242
         D1     245     244     247     246
      C3 D0  249000  248000  251000  250000
         D1  253000  252000  255000  254000

[64 rows x 4 columns]

プロット#

  • DataFrame.plotkind='hexbin'による六角形ビンプロット(GH 5478)、詳細はドキュメントを参照してください。

  • DataFrame.plotSeries.plotは、kind='area'を指定することで面積プロットをサポートするようになりました(GH 6656)。詳細はドキュメントを参照してください。

  • Series.plotDataFrame.plotkind='pie'による円グラフ(GH 6976)、詳細はドキュメントを参照してください。

  • DataFrameおよびSeriesオブジェクトの.plotメソッドで、エラーバー付きプロットがサポートされるようになりました(GH 3796GH 6834)。詳細はドキュメントを参照してください。

  • DataFrame.plotSeries.plotは、matplotlib.Tableをプロットするためのtableキーワードをサポートするようになりました。詳細はドキュメントを参照してください。tableキーワードは以下の値を受け取ることができます。

    • False: 何もしない(デフォルト)。

    • True: DataFrameまたはSeriesplotメソッドを呼び出してテーブルを描画します。matplotlibのデフォルトレイアウトに合わせてデータは転置されます。

    • DataFrameまたはSeries: 渡されたデータを使用してmatplotlib.tableを描画します。データはprintメソッドで表示されるとおりに描画されます(自動的に転置されません)。また、DataFrameおよびSeriesからテーブルを作成し、matplotlib.Axesに追加するためのヘルパー関数pandas.tools.plotting.tableが追加されました。

  • plot(legend='reverse')は、ほとんどのプロットの種類で凡例ラベルの順序を逆にするようになりました。(GH 6014

  • 折れ線グラフと面積グラフはstacked=Trueで積み重ねることができます(GH 6656)。

  • DataFrame.plot()kind='bar'およびkind='barh'を指定した場合、以下のキーワードが受け入れられるようになりました。

    • width: バーの幅を指定します。以前のバージョンでは、matplotlibに静的な値0.5が渡され、上書きできませんでした。(GH 6604

    • align: バーの配置を指定します。デフォルトはcenter(matplotlibとは異なります)。以前のバージョンでは、pandasはmatplotlibにalign='edge'を渡し、自身で位置をcenterに調整していました。その結果、alignキーワードは期待どおりに適用されませんでした。(GH 4525

    • position: 棒グラフのレイアウトの相対的な配置を指定します。0(左/下端)から1(右/上端)まで。デフォルトは0.5(中央)です。(GH 6604

    alignのデフォルト値が変更されたため、棒グラフの座標は整数値(0.0、1.0、2.0など)に配置されるようになりました。これは、棒グラフが折れ線グラフと同じ座標に配置されることを意図しています。ただし、set_xlimset_ylimなどを使用して棒の位置や描画領域を手動で調整する場合、棒グラフが予期せず異なる場合があります。これらの場合、新しい座標に合わせてスクリプトを修正してください。

  • parallel_coordinates()関数は、colorsではなくcolor引数を受け取るようになりました。古いcolors引数は将来のリリースでサポートされなくなることを警告するFutureWarningが発行されます。(GH 6956

  • parallel_coordinates()関数およびandrews_curves()関数は、dataではなく位置引数frameを受け取るようになりました。古いdata引数が名前で指定された場合、FutureWarningが発行されます。(GH 6956

  • DataFrame.boxplot()layoutキーワードをサポートするようになりました(GH 6769)。

  • DataFrame.boxplot()には新しいキーワード引数return_typeがあります。'dict''axes'、または'both'を受け入れ、この場合、matplotlibの軸とmatplotlib Linesの辞書を含む名前付きタプルが返されます。

以前のバージョンの非推奨/変更#

以前のバージョンの非推奨事項が0.14.0から有効になっています。

非推奨#

  • pivot_table()/DataFrame.pivot_table()およびcrosstab()関数は、rowsおよびcolsではなく、indexおよびcolumns引数を受け取るようになりました。古いrowsおよびcols引数は将来のリリースでサポートされなくなることを警告するFutureWarningが発行されます(GH 5505)。

  • DataFrame.drop_duplicates()およびDataFrame.duplicated()メソッドは、DataFrame.dropna()とより適切に整合させるため、colsではなくsubset引数を受け取るようになりました。古いcols引数は将来のリリースでサポートされなくなることを警告するFutureWarningが発行されます(GH 6680)。

  • DataFrame.to_csv()およびDataFrame.to_excel()関数は、colsではなくcolumns引数を受け取るようになりました。古いcols引数は将来のリリースでサポートされなくなることを警告するFutureWarningが発行されます(GH 6645)。

  • インデクサーは、スカラーインデクサーと非浮動小数点インデックスで使用される場合、FutureWarningを警告します(GH 4892GH 6960)。

    # non-floating point indexes can only be indexed by integers / labels
    In [1]: pd.Series(1, np.arange(5))[3.0]
            pandas/core/index.py:469: FutureWarning: scalar indexers for index type Int64Index should be integers and not floating point
    Out[1]: 1
    
    In [2]: pd.Series(1, np.arange(5)).iloc[3.0]
            pandas/core/index.py:469: FutureWarning: scalar indexers for index type Int64Index should be integers and not floating point
    Out[2]: 1
    
    In [3]: pd.Series(1, np.arange(5)).iloc[3.0:4]
            pandas/core/index.py:527: FutureWarning: slice indexers when using iloc should be integers and not floating point
    Out[3]:
            3    1
            dtype: int64
    
    # these are Float64Indexes, so integer or floating point is acceptable
    In [4]: pd.Series(1, np.arange(5.))[3]
    Out[4]: 1
    
    In [5]: pd.Series(1, np.arange(5.))[3.0]
    Out[6]: 1
    
  • Numpy 1.9の非推奨警告との互換性(GH 6960

  • Panel.shift()は、DataFrame.shift()と一致する関数シグネチャを持つようになりました。以前の位置引数lagsは、デフォルト値1のキーワード引数periodsに変更されました。古い引数lagsが名前で使用された場合、FutureWarningが発行されます。(GH 6910

  • factorize()orderキーワード引数は削除されます。(GH 6926)。

  • DataFrame.xs()Panel.major_xs()Panel.minor_xs()からcopyキーワードを削除しました。可能な場合はビューが返され、そうでない場合はコピーが作成されます。以前は、ユーザーはcopy=Falseが常にビューを返すと考えていた可能性があります。(GH 6894

  • parallel_coordinates()関数は、colorsではなくcolor引数を受け取るようになりました。古いcolors引数は将来のリリースでサポートされなくなることを警告するFutureWarningが発行されます。(GH 6956

  • parallel_coordinates()関数およびandrews_curves()関数は、dataではなく位置引数frameを受け取るようになりました。古いdata引数が名前で指定された場合、FutureWarningが発行されます。(GH 6956

  • DBAPI接続オブジェクトを使用する際の「mysql」フレーバーのサポートは非推奨となりました。MySQLは引き続きSQLAlchemyエンジンでサポートされます(GH 6900)。

  • 以下のio.sql関数は非推奨になりました: tquery, uquery, read_frame, frame_query, write_frame

  • describe()percentile_widthキーワード引数は非推奨になりました。代わりに、表示するパーセンタイルリストを受け取るpercentilesキーワードを使用してください。デフォルトの出力は変更されていません。

  • boxplot()のデフォルトの戻り値の型は、将来のリリースでdictからmatplotlib Axesに変更されます。return_type='axes'をboxplotに渡すことで、将来の動作を今すぐ使用できます。

既知の問題#

  • OpenPyXL 2.0.0で後方互換性が損なわれる(GH 7169

機能強化#

  • DataFrameとSeriesは、タプル辞書が渡された場合にMultiIndexオブジェクトを作成します。詳細はドキュメントを参照してください(GH 3323)。

    In [60]: pd.Series({('a', 'b'): 1, ('a', 'a'): 0,
       ....:            ('a', 'c'): 2, ('b', 'a'): 3, ('b', 'b'): 4})
       ....: 
    Out[60]: 
    a  b    1
       a    0
       c    2
    b  a    3
       b    4
    Length: 5, dtype: int64
    
    In [61]: pd.DataFrame({('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
       ....:              ('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
       ....:              ('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
       ....:              ('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
       ....:              ('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}})
       ....: 
    Out[61]: 
           a              b      
           b    a    c    a     b
    A B  1.0  4.0  5.0  8.0  10.0
      C  2.0  3.0  6.0  7.0   NaN
      D  NaN  NaN  NaN  NaN   9.0
    
    [3 rows x 5 columns]
    
  • Indexsym_diffメソッドが追加されました(GH 5543)。

  • DataFrame.to_latexは、longtableキーワードを受け取るようになりました。これがTrueの場合、longtable環境でテーブルが返されます。(GH 6617

  • DataFrame.to_latexでエスケープをオフにするオプションを追加(GH 6472

  • pd.read_clipboardは、キーワードsepが指定されていない場合、スプレッドシートからコピーされたデータを検出し、それに応じて解析しようとします。(GH 6223

  • 単一インデックスのDataFrameとMultiIndexed DataFrameの結合(GH 3662

    詳細はドキュメントを参照してください。MultiIndex DataFrameを左右両方で結合することは、現時点ではまだサポートされていません。

    In [62]: household = pd.DataFrame({'household_id': [1, 2, 3],
       ....:                           'male': [0, 1, 0],
       ....:                           'wealth': [196087.3, 316478.7, 294750]
       ....:                           },
       ....:                          columns=['household_id', 'male', 'wealth']
       ....:                          ).set_index('household_id')
       ....: 
    
    In [63]: household
    Out[63]: 
                  male    wealth
    household_id                
    1                0  196087.3
    2                1  316478.7
    3                0  294750.0
    
    [3 rows x 2 columns]
    
    In [64]: portfolio = pd.DataFrame({'household_id': [1, 2, 2, 3, 3, 3, 4],
       ....:                           'asset_id': ["nl0000301109",
       ....:                                        "nl0000289783",
       ....:                                        "gb00b03mlx29",
       ....:                                        "gb00b03mlx29",
       ....:                                        "lu0197800237",
       ....:                                        "nl0000289965",
       ....:                                        np.nan],
       ....:                           'name': ["ABN Amro",
       ....:                                    "Robeco",
       ....:                                    "Royal Dutch Shell",
       ....:                                    "Royal Dutch Shell",
       ....:                                    "AAB Eastern Europe Equity Fund",
       ....:                                    "Postbank BioTech Fonds",
       ....:                                    np.nan],
       ....:                           'share': [1.0, 0.4, 0.6, 0.15, 0.6, 0.25, 1.0]
       ....:                           },
       ....:                          columns=['household_id', 'asset_id', 'name', 'share']
       ....:                          ).set_index(['household_id', 'asset_id'])
       ....: 
    
    In [65]: portfolio
    Out[65]: 
                                                         name  share
    household_id asset_id                                           
    1            nl0000301109                        ABN Amro   1.00
    2            nl0000289783                          Robeco   0.40
                 gb00b03mlx29               Royal Dutch Shell   0.60
    3            gb00b03mlx29               Royal Dutch Shell   0.15
                 lu0197800237  AAB Eastern Europe Equity Fund   0.60
                 nl0000289965          Postbank BioTech Fonds   0.25
    4            NaN                                      NaN   1.00
    
    [7 rows x 2 columns]
    
    In [66]: household.join(portfolio, how='inner')
    Out[66]: 
                               male  ...  share
    household_id asset_id            ...       
    1            nl0000301109     0  ...   1.00
    2            nl0000289783     1  ...   0.40
                 gb00b03mlx29     1  ...   0.60
    3            gb00b03mlx29     0  ...   0.15
                 lu0197800237     0  ...   0.60
                 nl0000289965     0  ...   0.25
    
    [6 rows x 4 columns]
    
  • DataFrame.to_csvを使用する際に、quotechardoublequote、およびescapecharを指定できるようになりました(GH 5414GH 4528)。

  • sort_remainingブール型kwargを使用して、MultiIndexの指定されたレベルのみで部分的にソートします。(GH 3984

  • TimeStampおよびDatetimeIndexto_julian_dateを追加しました。ユリウス日は主に天文学で使用され、紀元前4713年1月1日正午からの日数を示します。pandasではナノ秒を使用して時間を定義するため、使用できる日付の実際の範囲は西暦1678年から2262年までです。(GH 4041

  • DataFrame.to_stataはStataデータ型との互換性をチェックし、必要に応じてアップキャストするようになりました。データ損失なくアップキャストできない場合は警告が発行されます(GH 6327)。

  • DataFrame.to_stataStataWriterは、ファイル作成時にタイムスタンプとデータセットラベルを設定できるキーワード引数time_stampとdata_labelを受け入れるようになりました。(GH 6545

  • pandas.io.gbqはユニコード文字列の読み込みを正しく処理するようになりました。(GH 5940

  • 祝日カレンダーが利用可能になり、CustomBusinessDayオフセットで使用できるようになりました(GH 6719)。

  • Float64Indexは、object dtype配列ではなく、float64 dtype ndarrayによってサポートされるようになりました(GH 6471)。

  • Panel.pct_changeを実装しました(GH 6904

  • ローリングモーメント関数にhowオプションを追加し、リサンプリングの処理方法を指定できるようにしました。rolling_max()はデフォルトでmax、rolling_min()はデフォルトでmin、その他はデフォルトでmeanとなります(GH 6297)。

  • CustomBusinessMonthBeginCustomBusinessMonthEndが利用可能になりました(GH 6866)。

  • Series.quantile()DataFrame.quantile()は、分位点の配列を受け入れるようになりました。

  • describe()は、要約統計量に含めるパーセンタイルの配列を受け入れるようになりました(GH 4196)。

  • pivot_tableは、indexおよびcolumnsキーワードでGrouperを受け入れることができるようになりました(GH 6913)。

    In [67]: import datetime
    
    In [68]: df = pd.DataFrame({
       ....:     'Branch': 'A A A A A B'.split(),
       ....:     'Buyer': 'Carl Mark Carl Carl Joe Joe'.split(),
       ....:     'Quantity': [1, 3, 5, 1, 8, 1],
       ....:     'Date': [datetime.datetime(2013, 11, 1, 13, 0),
       ....:              datetime.datetime(2013, 9, 1, 13, 5),
       ....:              datetime.datetime(2013, 10, 1, 20, 0),
       ....:              datetime.datetime(2013, 10, 2, 10, 0),
       ....:              datetime.datetime(2013, 11, 1, 20, 0),
       ....:              datetime.datetime(2013, 10, 2, 10, 0)],
       ....:     'PayDay': [datetime.datetime(2013, 10, 4, 0, 0),
       ....:                datetime.datetime(2013, 10, 15, 13, 5),
       ....:                datetime.datetime(2013, 9, 5, 20, 0),
       ....:                datetime.datetime(2013, 11, 2, 10, 0),
       ....:                datetime.datetime(2013, 10, 7, 20, 0),
       ....:                datetime.datetime(2013, 9, 5, 10, 0)]})
       ....: 
    
    In [69]: df
    Out[69]: 
      Branch Buyer  Quantity                Date              PayDay
    0      A  Carl         1 2013-11-01 13:00:00 2013-10-04 00:00:00
    1      A  Mark         3 2013-09-01 13:05:00 2013-10-15 13:05:00
    2      A  Carl         5 2013-10-01 20:00:00 2013-09-05 20:00:00
    3      A  Carl         1 2013-10-02 10:00:00 2013-11-02 10:00:00
    4      A   Joe         8 2013-11-01 20:00:00 2013-10-07 20:00:00
    5      B   Joe         1 2013-10-02 10:00:00 2013-09-05 10:00:00
    
    [6 rows x 5 columns]
    
    In [75]: df.pivot_table(values='Quantity',
       ....:                index=pd.Grouper(freq='M', key='Date'),
       ....:                columns=pd.Grouper(freq='M', key='PayDay'),
       ....:                aggfunc="sum")
    Out[75]:
    PayDay      2013-09-30  2013-10-31  2013-11-30
    Date
    2013-09-30         NaN         3.0         NaN
    2013-10-31         6.0         NaN         1.0
    2013-11-30         NaN         9.0         NaN
    
    [3 rows x 3 columns]
    
  • 文字列の配列を指定された幅で折り返すことができるようになりました(str.wrap)(GH 6999

  • Seriesnsmallest()およびSeries.nlargest()メソッドを追加しました。詳細はドキュメントを参照してください(GH 3960)。

  • PeriodIndexは、DatetimeIndexのように部分文字列インデックス付けを完全にサポートするようになりました(GH 7043)。

    In [76]: prng = pd.period_range('2013-01-01 09:00', periods=100, freq='H')
    
    In [77]: ps = pd.Series(np.random.randn(len(prng)), index=prng)
    
    In [78]: ps
    Out[78]:
    2013-01-01 09:00    0.015696
    2013-01-01 10:00   -2.242685
    2013-01-01 11:00    1.150036
    2013-01-01 12:00    0.991946
    2013-01-01 13:00    0.953324
                          ...
    2013-01-05 08:00    0.285296
    2013-01-05 09:00    0.484288
    2013-01-05 10:00    1.363482
    2013-01-05 11:00   -0.781105
    2013-01-05 12:00   -0.468018
    Freq: H, Length: 100, dtype: float64
    
    In [79]: ps['2013-01-02']
    Out[79]:
    2013-01-02 00:00    0.553439
    2013-01-02 01:00    1.318152
    2013-01-02 02:00   -0.469305
    2013-01-02 03:00    0.675554
    2013-01-02 04:00   -1.817027
                          ...
    2013-01-02 19:00    0.036142
    2013-01-02 20:00   -2.074978
    2013-01-02 21:00    0.247792
    2013-01-02 22:00   -0.897157
    2013-01-02 23:00   -0.136795
    Freq: H, Length: 24, dtype: float64
    
  • read_excelは、xlrd >= 0.9.3 を使用して、Excelの日付と時刻のミリ秒を読み取れるようになりました。(GH 5945

  • pd.stats.moments.rolling_varは、数値安定性を向上させるためにウェルフォード法を使用するようになりました(GH 6817)。

  • pd.expanding_applyおよびpd.rolling_applyは、funcに渡されるargsおよびkwargsを受け取るようになりました(GH 6289)。

  • DataFrame.rank()にパーセンテージランクオプションが追加されました(GH 5971)。

  • Series.rank()にパーセンテージランクオプションが追加されました(GH 5971)。

  • Series.rank()DataFrame.rank()は、ギャップのないランクのためのmethod='dense'を受け入れるようになりました(GH 6514)。

  • xlwtでのencodingのサポート(GH 3710

  • Blockクラスをリファクタリングし、アイテム処理での重複を避けるためにBlock.items属性を削除しました(GH 6745GH 6988)。

  • テストステートメントが特殊なassertを使用するように更新されました(GH 6175)。

パフォーマンス#

  • DatetimeIndexDatetimeConverterを使用して浮動小数点序数に変換する際のパフォーマンスが向上しました(GH 6636)。

  • DataFrame.shiftのパフォーマンス向上(GH 5609

  • MultiIndexed Seriesへのインデックス付けのパフォーマンス向上(GH 5567)。

  • 単一dtypeのインデックス付けにおけるパフォーマンス改善(GH 6484)。

  • 特定のオフセット(例:MonthEnd、BusinessMonthEnd)を持つDataFrameの構築パフォーマンスを向上させるために、誤ったキャッシュを削除しました(GH 6479)。

  • CustomBusinessDayのパフォーマンス改善(GH 6584

  • 文字列キーを持つSeriesのスライスインデックス付けのパフォーマンス向上(GH 6341GH 6372

  • イテラブルから指定された行数を読み取る際のDataFrame.from_recordsのパフォーマンス向上(GH 6700)。

  • 整数dtypesのtimedelta変換におけるパフォーマンス改善(GH 6754

  • 互換性のあるpickleのパフォーマンス向上(GH 6899

  • take_2dを最適化することで、特定の再インデックス操作のパフォーマンスを向上させる(GH 6749)。

  • GroupBy.count()がCythonで実装され、多数のグループで大幅に高速化されました(GH 7016)。

実験的#

0.14.0では実験的な変更はありません。

バグ修正#

  • インデックスがデータと一致しない場合のSeries ValueErrorのバグ(GH 6532

  • HDFStoreテーブル形式でMultiIndexがサポートされていないことによるセグメンテーションフォールトを防止する(GH 1848)。

  • pd.DataFrame.sort_indexで、ascending=Falseの場合にマージソートが安定しないバグ(GH 6399)。

  • 引数に先行ゼロがある場合のpd.tseries.frequencies.to_offsetのバグ(GH 6391)。

  • 浅いクローン/tarballからのインストールを伴う開発バージョンでのバージョン文字列生成のバグ(GH 6127)。

  • 現在の年のTimestamp / to_datetimeにおけるタイムゾーン解析の不整合(GH 5958)。

  • 再配列されたインデックスでのインデックス付けのバグ(GH 6252GH 6254

  • シリーズマルチインデックスを持つ.xsのバグ(GH 6258GH 5684

  • 文字列型を特定の頻度を持つDatetimeIndexに変換する際のバグ(GH 6273GH 6274)。

  • 大きな式で型プロモーションが失敗するevalのバグ(GH 6205)。

  • inplace=Trueでのinterpolateのバグ(GH 6281

  • HDFStore.removeはstartとstopを処理するようになりました(GH 6177)。

  • HDFStore.select_as_multipleselectと同様にstartとstopを処理します(GH 6177)。

  • HDFStore.select_as_coordinatesおよびselect_columnは、フィルタリングを生成するwhere句で動作します(GH 6177)。

  • 非一意なインデックスの結合における回帰(GH 6329

  • 単一関数と混合型フレームを持つgroupby aggに関する問題(GH 6337

  • DataFrame.replace()で非boolto_replace引数を渡した場合のバグ(GH 6332

  • MultiIndexの割り当てにおいて異なるレベルでアラインしようとすると発生するエラーを修正(GH 3738)。

  • ブールインデックス付けによる複合dtypeの設定のバグ(GH 6345

  • 非単調なDatetimeIndexが与えられた場合にTimeGrouper/resampleが不正な結果を返すバグ(GH 4161)。

  • TimeGrouper/resampleにおけるインデックス名伝播のバグ(GH 4161

  • TimeGrouperは、他のグルーパとより互換性のあるAPIを持つようになりました(例:groupsが欠落していました)(GH 3881)。

  • 対象列の順序に依存するTimeGrouperでの複数グループ化のバグ(GH 6764

  • '&'のようなトークンを含む文字列を解析する際のpd.evalのバグ(GH 6351)。

  • 整数0で割ったときにPanel内の-infの配置を正しく処理するバグ(GH 6178

  • DataFrame.shiftaxis=1を指定するとエラーが発生していました(GH 6371)。

  • リリース時までクリップボードテストを無効化(ローカルではnosetests -A disabledで実行)(GH 6048)。

  • DataFrame.replace()で、置換対象の値に含まれていないキーを持つネストされたdictを渡した場合のバグ(GH 6342)。

  • str.matchがnaフラグを無視していました(GH 6609)。

  • 統合されていない重複列のあるtakeのバグ(GH 6240)。

  • dtypesを変更するinterpolateのバグ(GH 6290

  • Series.getのバグ。バグのあるアクセス方法を使用していた (GH 6383)

  • hdfstoreクエリの形式におけるバグ: where=[('date', '>=', datetime(2013,1,1)), ('date', '<=', datetime(2014,1,1))] (GH 6313)

  • 重複するインデックスを持つDataFrame.dropnaのバグ (GH 6355)

  • 0.12以降、埋め込みリストのようなものを含む連結getitemインデックスでのリグレッション (GH 6394)

  • NaNを含むFloat64Indexが正しく比較されない (GH 6401)

  • @文字を含む文字列を持つeval/query式が動作するようになりました (GH 6366)。

  • 一部のNaN値を持つmethodを指定した場合のSeries.reindexのバグで、動作が不安定でした (リサンプルで確認) (GH 6418)

  • DataFrame.replace()のバグで、ネストされた辞書が誤って辞書キーと値の順序に依存していた (GH 5338)。

  • 空のオブジェクトとの連結におけるパフォーマンスの問題 (GH 3259)

  • NaN値を持つIndexオブジェクトにおけるsym_diffのソートを明確化 (GH 6444)

  • 入力としてDatetimeIndexを持つMultiIndex.from_productにおけるリグレッション (GH 6439)

  • デフォルト以外のインデックスが渡された場合のstr.extractのバグ (GH 6348)

  • pat=Nonen=1が渡された場合のstr.splitのバグ (GH 6466)

  • "F-F_Momentum_Factor"data_source="famafrench"が渡された場合のio.data.DataReaderのバグ (GH 6460)

  • timedelta64[ns]シリーズのsumのバグ (GH 6462)

  • タイムゾーンと特定のオフセットを含むresampleのバグ (GH 6397)

  • Seriesの重複するインデックスを持つiat/ilocのバグ (GH 6493)

  • read_htmlのバグで、NaNが誤ってテキストの欠損値を示すために使用されていた。pandasの他の部分との整合性のために空文字列を使用すべきです (GH 5129)。

  • read_htmlテストのバグで、リダイレクトされた無効なURLがテストを失敗させる原因となっていた (GH 6445)。

  • 一意でないインデックスで.locを使用する多軸インデックスのバグ (GH 6504)

  • DataFrameの列軸全体にわたるスライスインデックスで_ref_locs破損を引き起こすバグ (GH 6525)

  • Series作成時のnumpy datetime64非ns dtypeの扱いにおける0.13からのリグレッション (GH 6529)

  • set_indexに渡されるMultiIndexesの.names属性が保持されるようになりました (GH 6459)。

  • 重複するインデックスと位置合わせ可能なrhsを持つsetitemのバグ (GH 6541)

  • 混合整数インデックスで.locを使用するsetitemのバグ (GH 6546)

  • pd.read_stataのバグで、間違ったデータ型と欠損値を使用していた (GH 6327)

  • DataFrame.to_stataのバグで、特定のケースでデータ損失につながり、間違ったデータ型と欠損値を使用してエクスポートされる可能性があった (GH 6335)

  • StataWriterは文字列列の欠損値を空文字列に置き換えます (GH 6802)

  • Timestampの加算/減算における不整合な型 (GH 6543)

  • Timestampの加算/減算における頻度保持のバグ (GH 4547)

  • 空リストのルックアップのバグがIndexError例外を引き起こした (GH 6536, GH 6551)

  • object dtypeでSeries.quantileが例外を発生させる (GH 6555)

  • レベルでnanが削除された場合の.xsのバグ (GH 6574)

  • method='bfill/ffill'およびdatetime64[ns] dtypeを持つfillnaのバグ (GH 6587)

  • 混合dtypeを持つSQL書き込みのバグで、データ損失につながる可能性があった (GH 6509)

  • Series.popのバグ (GH 6600)

  • 位置インデクサーが対応する軸のInt64Indexと一致し、並べ替えが発生しなかった場合のilocインデックスのバグ (GH 6612)

  • limitvalueが指定された場合のfillnaのバグ

  • 列に非文字列名がある場合のDataFrame.to_stataのバグ (GH 4558)

  • np.compressとの互換性のバグで、(GH 6658)で表面化した

  • Seriesのrhsが位置合わせされていない場合の二項演算のバグ (GH 6681)

  • DataFrame.to_stataのバグで、nan値を誤って処理し、with_indexキーワード引数を無視していた (GH 6685)

  • 均等に割り切れる頻度を使用した場合の、余分なビンを含むリサンプルのバグ (GH 4076)

  • カスタム関数を渡したときのgroupby集約の一貫性のバグ (GH 6715)

  • how=Noneでリサンプル頻度が軸の頻度と同じ場合のリサンプルのバグ (GH 5955)

  • 空の配列でのダウンキャスティング推論のバグ (GH 6733)

  • 疎なコンテナでobj.blocksのバグで、同じdtypeの最後のアイテムを除くすべてのアイテムが削除されていた (GH 6748)

  • NaT (NaTType)のアンピクリングのバグ (GH 4606)

  • DataFrame.replace()のバグで、regex=Falseであっても正規表現のメタ文字が正規表現として扱われていた (GH 6777)。

  • 32ビットプラットフォームでのtimedelta演算のバグ (GH 6808)

  • .indexを介して直接tz対応インデックスを設定する際のバグ (GH 6785)

  • expressions.pyのバグで、numexprが算術演算を評価しようとしていた (GH 6762)。

  • Makefileのバグで、make cleanでCython生成のCファイルが削除されなかった (GH 6768)

  • HDFStoreから長い文字列を読み取る際のnumpy < 1.7.2とのバグ (GH 6166)

  • DataFrame._reduceのバグで、ブール値でない(0/1)整数がブール値に変換されていた (GH 6806)

  • 0.13からのリグレッションで、fillnaとdatetimeのようなSeriesを伴うもの (GH 6344)

  • タイムゾーンを持つDatetimeIndexnp.timedelta64を追加すると、誤った結果が出力されるバグ (GH 6818)

  • DataFrame.replace()のバグで、置換によってdtypeを変更すると、値の最初の出現のみが置換されていた (GH 6689)

  • Period構築で「MS」の頻度を渡した場合のより良いエラーメッセージ (GH5332)

  • max_rows=NoneでSeriesが1000行以上ある場合のSeries.__unicode__のバグ (GH 6863)

  • groupby.get_groupのバグで、datelikeが常に受け入れられなかった (GH 5267)

  • TimeGrouperによって作成されたgroupBy.get_groupAttributeErrorを発生させるバグ (GH 6914)

  • DatetimeIndex.tz_localizeDatetimeIndex.tz_convertNaTを誤って変換するバグ (GH 5546)

  • NaTに影響を与える算術演算のバグ (GH 6873)

  • Series.str.extractのバグで、単一グループの一致から得られたSeriesがグループ名にリネームされなかった

  • DataFrame.to_csvのバグで、index=Falseを設定するとheader kwargが無視された (GH 6186)

  • DataFrame.plotSeries.plotのバグで、同じ軸に繰り返しプロットすると凡例の動作が不一致であった (GH 6678)

  • __finalize__のパッチ適用に関する内部テスト / mergeがfinalizeしないバグ (GH 6923, GH 6927)

  • concatTextFileReaderを受け入れるようになり、これは一般的なユーザーの慣用句に影響を与えていた (GH 6583)

  • 先頭の空白を含むCパーサーのバグ (GH 3374)

  • delim_whitespace=True\r区切り行を含むCパーサーのバグ

  • カラムヘッダーの後に明示的なMultiIndexを持つ行のpythonパーサーのバグ (GH 6893)

  • Series.rankDataFrame.rankのバグで、小さな浮動小数点数 (<1e-13) がすべて同じランクを受け取っていた (GH 6886)

  • DataFrame.applyのバグで、*argsまたは**kwargsを使用し、空の結果を返す関数で発生していた (GH 6952)

  • 32ビットプラットフォームでのオーバーフロー時のsum/meanのバグ (GH 6915)

  • Panel.shiftNDFrame.slice_shiftに移動し、複数のdtypeを尊重するように修正 (GH 6959)

  • DataFrame.plotsubplots=Trueを有効にすると単一列の場合にTypeErrorが発生し、Series.plotAttributeErrorが発生するバグ (GH 6951)

  • DataFrame.plotのバグで、subplotskind=scatterを有効にすると不要な軸が描画されていた (GH 6951)

  • 非utf-8エンコーディングのファイルシステムからread_csvを実行する際のバグ (GH 6807)

  • 設定/位置合わせ時のilocのバグ (GH 6766)

  • get_dummiesがunicode値とプレフィックスで呼び出されたときにUnicodeEncodeErrorを引き起こすバグ (GH 6885)

  • 周波数付き時系列プロットカーソル表示のバグ (GH 5453)

  • Float64Indexを使用する際にgroupby.plotで表面化したバグ (GH 7025)

  • Yahooからオプションデータをダウンロードできない場合にテストが失敗するのを止めました (GH 7034)

  • parallel_coordinatesradvizのバグで、クラス列の並べ替えにより色/クラスの不一致が発生する可能性があった (GH 6956)

  • radvizandrews_curvesのバグで、「color」の複数の値がプロットメソッドに渡されていた (GH 6956)

  • Float64Index.isin()のバグで、nansを含むと、インデックスがすべてのものを含んでいると主張していた (GH 7066)。

  • DataFrame.boxplotのバグで、ax引数として渡された軸を使用できなかった (GH 3578)

  • XlsxWriterおよびXlwtWriterの実装におけるバグで、datetime列が時刻なしで書式設定されていた (GH 7075) がプロットメソッドに渡されていた

  • read_fwf()colspec内のNoneを通常のpythonスライスのように扱います。colspecNoneが含まれている場合、行の最初から、または行の終わりまで読み取るようになりました (以前はTypeErrorを発生させていた)。

  • 連結インデックスとスライスにおけるキャッシュの一貫性のバグ。NDFrame_is_viewプロパティを追加してビューを正しく予測するように修正。xsis_copyは、実際のコピーである場合のみ (ビューではない場合) マークされるように修正 (GH 7084)

  • dayfirst=Trueを持つ文字列ndarrayからのDatetimeIndex作成のバグ (GH 5917)

  • DatetimeIndexから作成されたMultiIndex.from_arraysfreqtzを保持しないバグ (GH 7090)

  • MultiIndexPeriodIndexが含まれている場合にunstackValueErrorを発生させるバグ (GH 4342)

  • boxplothistが不要な軸を描画するバグ (GH 6769)

  • 範囲外のインデクサーに対するgroupby.nth()におけるリグレッション (GH 6621)

  • datetime値を持つquantileのバグ (GH 6965)

  • Dataframe.set_index, reindex, pivotDatetimeIndexPeriodIndexの属性を保持しないバグ (GH 3950, GH 5878, GH 6631)

  • MultiIndex.get_level_valuesDatetimeIndexPeriodIndexの属性を保持しないバグ (GH 7092)

  • Groupbytzを保持しないバグ (GH 3950)

  • PeriodIndexの部分文字列スライスにおけるバグ (GH 6716)

  • 切り詰められたSeriesまたはDataFrameのHTML reprで、large_reprが「info」に設定されている場合にクラス名が表示されないバグ (GH 7105)

  • DatetimeIndexfreqを指定すると、渡された値が短すぎる場合にValueErrorが発生するバグ (GH 7098)

  • info表現がdisplay.max_info_columns設定を尊重しないバグを修正しました(GH 6939)。

  • PeriodIndexの文字列スライスで範囲外の値を持つバグ (GH 5407)

  • 大きなテーブルのリサイズ時のハッシュテーブル実装/ファクトライザーにおけるメモリエラーを修正 (GH 7157)

  • 0次元オブジェクト配列に適用された場合のisnullのバグ (GH 7176)

  • query/evalのバグで、グローバル定数が正しくルックアップされなかった (GH 7178)

  • ilocと多軸タプルインデクサーで、範囲外の位置リストインデクサーを認識する際のバグ (GH 7189)

  • 単一値、MultiIndex、整数インデックスを持つsetitemのバグ (GH 7190, GH 7218)

  • 反転した演算を持つ式の評価のバグで、Series-DataFrame演算で表示されていた (GH 7198, GH 7192)

  • 2次元を超えるndimとMultiIndexを持つ多軸インデックスのバグ (GH 7199)

  • 無効なeval/query操作がスタックを使い果たすバグを修正 (GH 5198)

貢献者#

このリリースには合計94人がパッチを貢献しました。名前の横に「+」がある人は初めてパッチを貢献しました。

  • Acanthostega +

  • Adam Marcus +

  • Alex Gaudio

  • アレックス・ロスバーグ

  • AllenDowney +

  • Andrew Rosenfeld +

  • アンディ・ヘイデン

  • Antoine Mazières +

  • Benedikt Sauer

  • Brad Buran

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

  • Clark Fitzgerald

  • DSM

  • Dale Jung

  • Dan Allan

  • Dan Birken

  • Daniel Waeber

  • David Jung +

  • David Stephens +

  • Douglas McNeil

  • Garrett Drapala

  • Gouthaman Balaraman +

  • Guillaume Poulin +

  • Jacob Howard +

  • ジェイコブ・シャアー

  • Jason Sexauer +

  • ジェフ・リーバック

  • Jeff Tratner

  • Jeffrey Starr +

  • John David Reaver +

  • John McNamara

  • John W. O’Brien

  • Jonathan Chambers

  • Joris Van den Bossche

  • Julia Evans

  • Júlio +

  • K.-Michael Aye

  • Katie Atkinson +

  • ケルシー・ジョーダル

  • Kevin Sheppard +

  • Matt Wittmann +

  • Matthias Kuhn +

  • Max Grender-Jones +

  • Michael E. Gruen +

  • Mike Kelly

  • Nipun Batra +

  • Noah Spies +

  • PKEuS

  • Patrick O’Keeffe

  • Phillip Cloud

  • Pietro Battiston +

  • Randy Carnevale +

  • Robert Gibboni +

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

  • SplashDance +

  • Stephan Hoyer +

  • Tim Cera +

  • Tobias Brandt

  • Todd Jennings +

  • Tom Augspurger

  • TomAugspurger

  • ヤロスラフ・ハルチェンコ

  • agijsberts +

  • akittredge

  • ankostis +

  • anomrake

  • anton-d +

  • bashtage +

  • benjamin +

  • bwignall

  • cgohlke +

  • chebee7i +

  • clham +

  • danielballan

  • hshimizu77 +

  • hugo +

  • immerrr

  • ischwabacher +

  • jaimefrio +

  • jreback

  • jsexauer +

  • kdiether +

  • michaelws +

  • mikebailey +

  • ojdo +

  • onesandzeroes +

  • phaebz +

  • ribonoous +

  • ロックg

  • sinhrks +

  • unutbu

  • westurner

  • y-p

  • zach powers