バージョン 0.19.0 (2016年10月2日)#

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

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

  • アズオブ形式の時系列結合のための merge_asof()こちらを参照

  • .rolling() が時系列対応になりました。こちらを参照

  • read_csv()Categorical データのパースをサポートしました。こちらを参照

  • カテゴリカルデータを結合するための関数 union_categorical() が追加されました。こちらを参照

  • PeriodIndex に独自の period dtypes が追加され、他の Index クラスとの一貫性が高まりました。こちらを参照

  • 疎なデータ構造が int および bool dtypes のサポートを強化しました。こちらを参照

  • Series との比較演算でインデックスが無視されなくなりました。API 変更の概要はこちらを参照

  • ユーティリティ関数の pandas 開発 API の導入。こちらを参照。

  • Panel4D および PanelND の非推奨化。これらの種類のn次元データは、xarray パッケージで表現することをお勧めします。

  • 以前に非推奨化されたモジュール pandas.io.data, pandas.io.wb, pandas.tools.rplot の削除。

警告

pandas >= 0.19.0 では、インポート時に numpy ufunc の警告が抑制されなくなります。こちらを参照。

新機能#

アズオブ形式の時系列結合のための関数 merge_asof#

長らく要望されていた機能が merge_asof() 関数によって追加され、アズオブ形式の時系列結合をサポートするようになりました (GH 1870, GH 13695, GH 13709, GH 13902)。完全なドキュメントはこちらです。

merge_asof() はアズオブマージを実行します。これは、キーが等しい場合ではなく、最も近いキーで一致させる点を除いて、左結合に似ています。

In [1]: left = pd.DataFrame({"a": [1, 5, 10], "left_val": ["a", "b", "c"]})

In [2]: right = pd.DataFrame({"a": [1, 2, 3, 6, 7], "right_val": [1, 2, 3, 6, 7]})

In [3]: left
Out[3]: 
    a left_val
0   1        a
1   5        b
2  10        c

[3 rows x 2 columns]

In [4]: right
Out[4]: 
   a  right_val
0  1          1
1  2          2
2  3          3
3  6          6
4  7          7

[5 rows x 2 columns]

通常、可能な場合は正確に一致させ、それ以外の場合は最新の値を使用したいと考えます。

In [5]: pd.merge_asof(left, right, on="a")
Out[5]: 
    a left_val  right_val
0   1        a          1
1   5        b          3
2  10        c          7

[3 rows x 3 columns]

以前のデータのみと一致させ、正確な一致は行わないこともできます。

In [6]: pd.merge_asof(left, right, on="a", allow_exact_matches=False)
Out[6]: 
    a left_val  right_val
0   1        a        NaN
1   5        b        3.0
2  10        c        7.0

[3 rows x 3 columns]

典型的な時系列の例では、tradesquotes があり、それらを asof-join したいと考えます。これは、マージする前にデータをグループ化するために by パラメーターを使用する例も示しています。

In [7]: trades = pd.DataFrame(
   ...:     {
   ...:         "time": pd.to_datetime(
   ...:             [
   ...:                 "20160525 13:30:00.023",
   ...:                 "20160525 13:30:00.038",
   ...:                 "20160525 13:30:00.048",
   ...:                 "20160525 13:30:00.048",
   ...:                 "20160525 13:30:00.048",
   ...:             ]
   ...:         ),
   ...:         "ticker": ["MSFT", "MSFT", "GOOG", "GOOG", "AAPL"],
   ...:         "price": [51.95, 51.95, 720.77, 720.92, 98.00],
   ...:         "quantity": [75, 155, 100, 100, 100],
   ...:     },
   ...:     columns=["time", "ticker", "price", "quantity"],
   ...: )
   ...: 

In [8]: quotes = pd.DataFrame(
   ...:     {
   ...:         "time": pd.to_datetime(
   ...:             [
   ...:                 "20160525 13:30:00.023",
   ...:                 "20160525 13:30:00.023",
   ...:                 "20160525 13:30:00.030",
   ...:                 "20160525 13:30:00.041",
   ...:                 "20160525 13:30:00.048",
   ...:                 "20160525 13:30:00.049",
   ...:                 "20160525 13:30:00.072",
   ...:                 "20160525 13:30:00.075",
   ...:             ]
   ...:         ),
   ...:         "ticker": ["GOOG", "MSFT", "MSFT", "MSFT", "GOOG", "AAPL", "GOOG", "MSFT"],
   ...:         "bid": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],
   ...:         "ask": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03],
   ...:     },
   ...:     columns=["time", "ticker", "bid", "ask"],
   ...: )
   ...: 
In [9]: trades
Out[9]: 
                     time ticker   price  quantity
0 2016-05-25 13:30:00.023   MSFT   51.95        75
1 2016-05-25 13:30:00.038   MSFT   51.95       155
2 2016-05-25 13:30:00.048   GOOG  720.77       100
3 2016-05-25 13:30:00.048   GOOG  720.92       100
4 2016-05-25 13:30:00.048   AAPL   98.00       100

[5 rows x 4 columns]

In [10]: quotes
Out[10]: 
                     time ticker     bid     ask
0 2016-05-25 13:30:00.023   GOOG  720.50  720.93
1 2016-05-25 13:30:00.023   MSFT   51.95   51.96
2 2016-05-25 13:30:00.030   MSFT   51.97   51.98
3 2016-05-25 13:30:00.041   MSFT   51.99   52.00
4 2016-05-25 13:30:00.048   GOOG  720.50  720.93
5 2016-05-25 13:30:00.049   AAPL   97.99   98.01
6 2016-05-25 13:30:00.072   GOOG  720.50  720.88
7 2016-05-25 13:30:00.075   MSFT   52.01   52.03

[8 rows x 4 columns]

アズオブマージは、通常は日付時刻のような並べ替え可能なフィールドである on で結合し、この場合は by フィールドでグルーパーを使用します。これは左外部結合に似ていますが、最新の非 NaN 値を自動的に前方埋めします。

In [11]: pd.merge_asof(trades, quotes, on="time", by="ticker")
Out[11]: 
                     time ticker   price  quantity     bid     ask
0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN

[5 rows x 6 columns]

これは、元の左側のデータフレーム (trades) と同じ順序でエントリを持つマージされた DataFrame を返し、quotes のフィールドがマージされます。

メソッド .rolling() が時系列対応になりました#

.rolling() オブジェクトが時系列対応になり、window 引数に時系列オフセット (または変換可能なもの) を受け入れられるようになりました (GH 13327, GH 12995)。完全なドキュメントはこちらを参照してください。

In [12]: dft = pd.DataFrame(
   ....:     {"B": [0, 1, 2, np.nan, 4]},
   ....:     index=pd.date_range("20130101 09:00:00", periods=5, freq="s"),
   ....: )
   ....: 

In [13]: dft
Out[13]: 
                       B
2013-01-01 09:00:00  0.0
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  2.0
2013-01-01 09:00:03  NaN
2013-01-01 09:00:04  4.0

[5 rows x 1 columns]

これは通常の頻度インデックスです。整数ウィンドウパラメーターを使用すると、ウィンドウ頻度でロールできます。

In [14]: dft.rolling(2).sum()
Out[14]: 
                       B
2013-01-01 09:00:00  NaN
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  3.0
2013-01-01 09:00:03  NaN
2013-01-01 09:00:04  NaN

[5 rows x 1 columns]

In [15]: dft.rolling(2, min_periods=1).sum()
Out[15]: 
                       B
2013-01-01 09:00:00  0.0
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  3.0
2013-01-01 09:00:03  2.0
2013-01-01 09:00:04  4.0

[5 rows x 1 columns]

オフセットを指定すると、より直感的にローリング頻度を指定できます。

In [16]: dft.rolling("2s").sum()
Out[16]: 
                       B
2013-01-01 09:00:00  0.0
2013-01-01 09:00:01  1.0
2013-01-01 09:00:02  3.0
2013-01-01 09:00:03  2.0
2013-01-01 09:00:04  4.0

[5 rows x 1 columns]

非規則的だが単調なインデックスを使用する場合、整数ウィンドウでのローリングは特別な計算を課しません。

In [17]: dft = pd.DataFrame(
   ....:     {"B": [0, 1, 2, np.nan, 4]},
   ....:     index=pd.Index(
   ....:         [
   ....:             pd.Timestamp("20130101 09:00:00"),
   ....:             pd.Timestamp("20130101 09:00:02"),
   ....:             pd.Timestamp("20130101 09:00:03"),
   ....:             pd.Timestamp("20130101 09:00:05"),
   ....:             pd.Timestamp("20130101 09:00:06"),
   ....:         ],
   ....:         name="foo",
   ....:     ),
   ....: )
   ....: 

In [18]: dft
Out[18]: 
                       B
foo                     
2013-01-01 09:00:00  0.0
2013-01-01 09:00:02  1.0
2013-01-01 09:00:03  2.0
2013-01-01 09:00:05  NaN
2013-01-01 09:00:06  4.0

[5 rows x 1 columns]

In [19]: dft.rolling(2).sum()
Out[19]: 
                       B
foo                     
2013-01-01 09:00:00  NaN
2013-01-01 09:00:02  1.0
2013-01-01 09:00:03  3.0
2013-01-01 09:00:05  NaN
2013-01-01 09:00:06  NaN

[5 rows x 1 columns]

時系列指定を使用すると、この疎なデータに対して可変ウィンドウが生成されます。

In [20]: dft.rolling("2s").sum()
Out[20]: 
                       B
foo                     
2013-01-01 09:00:00  0.0
2013-01-01 09:00:02  1.0
2013-01-01 09:00:03  3.0
2013-01-01 09:00:05  NaN
2013-01-01 09:00:06  4.0

[5 rows x 1 columns]

さらに、DataFrame のインデックス (デフォルトではない) ではなく列を指定するために、オプションの on パラメーターを許可するようになりました。

In [21]: dft = dft.reset_index()

In [22]: dft
Out[22]: 
                  foo    B
0 2013-01-01 09:00:00  0.0
1 2013-01-01 09:00:02  1.0
2 2013-01-01 09:00:03  2.0
3 2013-01-01 09:00:05  NaN
4 2013-01-01 09:00:06  4.0

[5 rows x 2 columns]

In [23]: dft.rolling("2s", on="foo").sum()
Out[23]: 
                  foo    B
0 2013-01-01 09:00:00  0.0
1 2013-01-01 09:00:02  1.0
2 2013-01-01 09:00:03  3.0
3 2013-01-01 09:00:05  NaN
4 2013-01-01 09:00:06  4.0

[5 rows x 2 columns]

メソッド read_csv の重複列名に対するサポートが改善されました#

read_csv() で、ファイル内にあるか names パラメータとして渡されたかにかかわらず、重複する列名がサポートされるようになりました (GH 7160, GH 9424)

In [24]: data = "0,1,2\n3,4,5"

In [25]: names = ["a", "b", "a"]

以前の動作:

In [2]: pd.read_csv(StringIO(data), names=names)
Out[2]:
   a  b  a
0  2  1  2
1  5  4  5

最初の a 列は2番目の a 列と同じデータを含んでいましたが、本来は値 [0, 3] を含んでいるべきでした。

新しい動作:

In [26]: pd.read_csv(StringIO(data), names=names)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[26], line 1
----> 1 pd.read_csv(StringIO(data), names=names)

File ~/work/pandas/pandas/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
   1013 kwds_defaults = _refine_defaults_read(
   1014     dialect,
   1015     delimiter,
   (...)
   1022     dtype_backend=dtype_backend,
   1023 )
   1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)

File ~/work/pandas/pandas/pandas/io/parsers/readers.py:617, in _read(filepath_or_buffer, kwds)
    614 nrows = kwds.get("nrows", None)
    616 # Check for duplicates in names.
--> 617 _validate_names(kwds.get("names", None))
    619 # Create the parser.
    620 parser = TextFileReader(filepath_or_buffer, **kwds)

File ~/work/pandas/pandas/pandas/io/parsers/readers.py:576, in _validate_names(names)
    574 if names is not None:
    575     if len(names) != len(set(names)):
--> 576         raise ValueError("Duplicate names are not allowed.")
    577     if not (
    578         is_list_like(names, allow_sets=False) or isinstance(names, abc.KeysView)
    579     ):
    580         raise ValueError("Names should be an ordered collection.")

ValueError: Duplicate names are not allowed.

メソッド read_csvCategorical の直接パースをサポートしました#

read_csv() 関数が、dtype として指定された場合に Categorical 列のパースをサポートするようになりました (GH 10153)。データの構造によっては、パース後に Categorical に変換する場合と比較して、パース時間の短縮とメモリ使用量の削減につながる可能性があります。I/O ドキュメントはこちらを参照してください。

In [27]: data = """
   ....: col1,col2,col3
   ....: a,b,1
   ....: a,b,2
   ....: c,d,3
   ....: """
   ....: 

In [28]: pd.read_csv(StringIO(data))
Out[28]: 
  col1 col2  col3
0    a    b     1
1    a    b     2
2    c    d     3

[3 rows x 3 columns]

In [29]: pd.read_csv(StringIO(data)).dtypes
Out[29]: 
col1    object
col2    object
col3     int64
Length: 3, dtype: object

In [30]: pd.read_csv(StringIO(data), dtype="category").dtypes
Out[30]: 
col1    category
col2    category
col3    category
Length: 3, dtype: object

個々の列は dict 指定を使用して Categorical としてパースできます

In [31]: pd.read_csv(StringIO(data), dtype={"col1": "category"}).dtypes
Out[31]: 
col1    category
col2      object
col3       int64
Length: 3, dtype: object

結果のカテゴリは常に文字列 (オブジェクト dtype) としてパースされます。カテゴリが数値の場合、to_numeric() 関数、または必要に応じて to_datetime() などの別のコンバーターを使用して変換できます。

In [32]: df = pd.read_csv(StringIO(data), dtype="category")

In [33]: df.dtypes
Out[33]: 
col1    category
col2    category
col3    category
Length: 3, dtype: object

In [34]: df["col3"]
Out[34]: 
0    1
1    2
2    3
Name: col3, Length: 3, dtype: category
Categories (3, object): ['1', '2', '3']

In [35]: new_categories = pd.to_numeric(df["col3"].cat.categories)

In [36]: df["col3"] = df["col3"].cat.rename_categories(new_categories)

In [37]: df["col3"]
Out[37]: 
0    1
1    2
2    3
Name: col3, Length: 3, dtype: category
Categories (3, int64): [1, 2, 3]

カテゴリカル結合#

  • カテゴリカルデータを結合するための関数 union_categoricals() が追加されました。カテゴリカルのユニオンを参照してください (GH 13361, GH 13763, GH 13846, GH 14173)

    In [38]: from pandas.api.types import union_categoricals
    
    In [39]: a = pd.Categorical(["b", "c"])
    
    In [40]: b = pd.Categorical(["a", "b"])
    
    In [41]: union_categoricals([a, b])
    Out[41]: 
    ['b', 'c', 'a', 'b']
    Categories (3, object): ['b', 'c', 'a']
    
  • concat および append が、異なる categories を持つ category dtypes を object dtype として連結できるようになりました (GH 13524)

    In [42]: s1 = pd.Series(["a", "b"], dtype="category")
    
    In [43]: s2 = pd.Series(["b", "c"], dtype="category")
    

以前の動作:

In [1]: pd.concat([s1, s2])
ValueError: incompatible categories in categorical concat

新しい動作:

In [44]: pd.concat([s1, s2])
Out[44]: 
0    a
1    b
0    b
1    c
Length: 4, dtype: object

半月オフセット#

pandas に新しい頻度オフセット、SemiMonthEnd (‘SM’) と SemiMonthBegin (‘SMS’) が追加されました。これらは、それぞれ (デフォルトで) 月の15日と月末、および月の15日と1日に固定された日付オフセットを提供します。 (GH 1543)

In [45]: from pandas.tseries.offsets import SemiMonthEnd, SemiMonthBegin

SemiMonthEnd:

In [46]: pd.Timestamp("2016-01-01") + SemiMonthEnd()
Out[46]: Timestamp('2016-01-15 00:00:00')

In [47]: pd.date_range("2015-01-01", freq="SM", periods=4)
Out[47]: DatetimeIndex(['2015-01-15', '2015-01-31', '2015-02-15', '2015-02-28'], dtype='datetime64[ns]', freq='SM-15')

SemiMonthBegin:

In [46]: pd.Timestamp("2016-01-01") + SemiMonthBegin()
Out[46]: Timestamp('2016-01-15 00:00:00')

In [47]: pd.date_range("2015-01-01", freq="SMS", periods=4)
Out[47]: DatetimeIndex(['2015-01-01', '2015-01-15', '2015-02-01', '2015-02-15'], dtype='datetime64[ns]', freq='SMS-15')

固定接尾辞を使用すると、15日の代わりに使用する月の日も指定できます。

In [50]: pd.date_range("2015-01-01", freq="SMS-16", periods=4)
Out[50]: DatetimeIndex(['2015-01-01', '2015-01-16', '2015-02-01', '2015-02-16'], dtype='datetime64[ns]', freq='SMS-16')

In [51]: pd.date_range("2015-01-01", freq="SM-14", periods=4)
Out[51]: DatetimeIndex(['2015-01-14', '2015-01-31', '2015-02-14', '2015-02-28'], dtype='datetime64[ns]', freq='SM-14')

新しいインデックスメソッド#

Series および DataFrame API との一貫性を高めるため、以下のメソッドとオプションが Index に追加されました。

Index が、同じ形状のインデックス付けのための .where() 関数をサポートするようになりました (GH 13170)

In [48]: idx = pd.Index(["a", "b", "c"])

In [49]: idx.where([True, False, True])
Out[49]: Index(['a', None, 'c'], dtype='object')

Index が、欠損値を除外するための .dropna() をサポートするようになりました (GH 6194)

In [50]: idx = pd.Index([1, 2, np.nan, 4])

In [51]: idx.dropna()
Out[51]: Index([1.0, 2.0, 4.0], dtype='float64')

MultiIndex の場合、デフォルトではいずれかのレベルが欠損している場合に値が削除されます。how='all' を指定すると、すべてのレベルが欠損している値のみが削除されます。

In [52]: midx = pd.MultiIndex.from_arrays([[1, 2, np.nan, 4], [1, 2, np.nan, np.nan]])

In [53]: midx
Out[53]: 
MultiIndex([(1.0, 1.0),
            (2.0, 2.0),
            (nan, nan),
            (4.0, nan)],
           )

In [54]: midx.dropna()
Out[54]: 
MultiIndex([(1, 1),
            (2, 2)],
           )

In [55]: midx.dropna(how="all")
Out[55]: 
MultiIndex([(1, 1.0),
            (2, 2.0),
            (4, nan)],
           )

Index が、DataFrame を返す .str.extractall() をサポートするようになりました。詳細はこちらのドキュメントを参照してください (GH 10008, GH 13156)

In [56]: idx = pd.Index(["a1a2", "b1", "c1"])

In [57]: idx.str.extractall(r"[ab](?P<digit>\d)")
Out[57]: 
        digit
  match      
0 0         1
  1         2
1 0         1

[3 rows x 1 columns]

Index.astype() がオプションのブール引数 copy を受け入れるようになりました。これにより、dtype の要件が満たされている場合にオプションのコピーが可能になります (GH 13209)

Google BigQuery の機能強化#

  • read_gbq() メソッドに dialect 引数が追加され、ユーザーが BigQuery のレガシー SQL または標準 SQL のどちらを使用するかを指定できるようになりました。詳細については、ドキュメントを参照してください (GH 13615)。

  • to_gbq() メソッドが、DataFrame の列順序が宛先テーブルスキーマと異なることを許可するようになりました (GH 11359)。

きめ細かい NumPy errstate#

以前のバージョンの pandas では、pandas をインポートすると NumPy の ufunc エラー処理が永久に抑制されていました。これは、通常 NaN として表現される欠損データで NumPy ufunc を使用した際に発生する警告を抑制するためでした。残念ながら、これにより、pandas 以外のアプリケーションコードで発生する正当な警告も抑制されていました。0.19.0 からは、pandas は numpy.errstate コンテキストマネージャーを使用して、これらの警告をよりきめ細かく抑制し、pandas のコードベースでこれらの操作が実際に使用されている箇所でのみ警告を抑制します。 (GH 13109, GH 13145)

pandas をアップグレードした後、コードから 新しい RuntimeWarnings が発行される場合があります。これらは正当なものであり、根本原因は以前のバージョンの pandas を使用していたときにも存在していた可能性がありますが、単に警告が抑制されていただけです。RuntimeWarning の発生源の周囲で numpy.errstate を使用して、これらの条件の処理方法を制御してください。

メソッド get_dummies が整数 dtype を返すようになりました#

pd.get_dummies 関数が、ダミーエンコードされた列を浮動小数点数ではなく、より小さい整数として返すようになりました (GH 8725)。これにより、メモリフットプリントが改善されるはずです。

以前の動作:

In [1]: pd.get_dummies(['a', 'b', 'a', 'c']).dtypes

Out[1]:
a    float64
b    float64
c    float64
dtype: object

新しい動作:

In [58]: pd.get_dummies(["a", "b", "a", "c"]).dtypes
Out[58]: 
a    bool
b    bool
c    bool
Length: 3, dtype: object

to_numeric で値を可能な最小の dtype にダウンキャスト#

pd.to_numeric()downcast パラメーターを受け入れるようになりました。これにより、可能であればデータを指定された最小の数値 dtype にダウンキャストします (GH 13352)

In [59]: s = ["1", 2, 3]

In [60]: pd.to_numeric(s, downcast="unsigned")
Out[60]: array([1, 2, 3], dtype=uint8)

In [61]: pd.to_numeric(s, downcast="integer")
Out[61]: array([1, 2, 3], dtype=int8)

pandas 開発 API#

将来的に pandas API をより統一的でアクセスしやすくするため、pandas の標準的なサブパッケージ pandas.api を作成し、公開 API を保持するようにしました。pandas.api.types で型イントロスペクション関数を公開することから始めています。将来のバージョンの pandas では、さらに多くのサブパッケージと公式に承認された API が公開される予定です (GH 13147, GH 13634)

以下は現在この API の一部です

In [62]: import pprint

In [63]: from pandas.api import types

In [64]: funcs = [f for f in dir(types) if not f.startswith("_")]

In [65]: pprint.pprint(funcs)
['CategoricalDtype',
 'DatetimeTZDtype',
 'IntervalDtype',
 'PeriodDtype',
 'infer_dtype',
 'is_any_real_numeric_dtype',
 'is_array_like',
 'is_bool',
 'is_bool_dtype',
 'is_categorical_dtype',
 'is_complex',
 'is_complex_dtype',
 'is_datetime64_any_dtype',
 'is_datetime64_dtype',
 'is_datetime64_ns_dtype',
 'is_datetime64tz_dtype',
 'is_dict_like',
 'is_dtype_equal',
 'is_extension_array_dtype',
 'is_file_like',
 'is_float',
 'is_float_dtype',
 'is_hashable',
 'is_int64_dtype',
 'is_integer',
 'is_integer_dtype',
 'is_interval',
 'is_interval_dtype',
 'is_iterator',
 'is_list_like',
 'is_named_tuple',
 'is_number',
 'is_numeric_dtype',
 'is_object_dtype',
 'is_period_dtype',
 'is_re',
 'is_re_compilable',
 'is_scalar',
 'is_signed_integer_dtype',
 'is_sparse',
 'is_string_dtype',
 'is_timedelta64_dtype',
 'is_timedelta64_ns_dtype',
 'is_unsigned_integer_dtype',
 'pandas_dtype',
 'union_categoricals']

内部モジュール pandas.core.common からこれらの関数を呼び出すと、DeprecationWarning が表示されるようになりました (GH 13990)

その他の機能強化#

  • Timestampdatetime.datetime() と同様に位置引数とキーワード引数を受け入れるようになりました (GH 10758, GH 11630)

    In [66]: pd.Timestamp(2012, 1, 1)
    Out[66]: Timestamp('2012-01-01 00:00:00')
    
    In [67]: pd.Timestamp(year=2012, month=1, day=1, hour=8, minute=30)
    Out[67]: Timestamp('2012-01-01 08:30:00')
    
  • .resample() 関数が、日付時刻のような列または MultiIndex レベルでリサンプリングするために on= または level= パラメータを受け入れるようになりました (GH 13500)

    In [68]: df = pd.DataFrame(
       ....:     {"date": pd.date_range("2015-01-01", freq="W", periods=5), "a": np.arange(5)},
       ....:     index=pd.MultiIndex.from_arrays(
       ....:         [[1, 2, 3, 4, 5], pd.date_range("2015-01-01", freq="W", periods=5)],
       ....:         names=["v", "d"],
       ....:     ),
       ....: )
       ....: 
    
    In [69]: df
    Out[69]: 
                       date  a
    v d                       
    1 2015-01-04 2015-01-04  0
    2 2015-01-11 2015-01-11  1
    3 2015-01-18 2015-01-18  2
    4 2015-01-25 2015-01-25  3
    5 2015-02-01 2015-02-01  4
    
    [5 rows x 2 columns]
    
    In [74]: df.resample("M", on="date")[["a"]].sum()
    Out[74]:
                a
    date
    2015-01-31  6
    2015-02-28  4
    
    [2 rows x 1 columns]
    
    In [75]: df.resample("M", level="d")[["a"]].sum()
    Out[75]:
                a
    d
    2015-01-31  6
    2015-02-28  4
    
    [2 rows x 1 columns]
    
  • GbqConnector.get_credentials() メソッドが、まずアプリケーションのデフォルト認証情報の取得を試行できるようになりました。詳細については、ドキュメントを参照してください (GH 13577)。

  • DatetimeIndex および Timestamp.tz_localize() メソッドに errors キーワードが追加され、存在しないタイムスタンプを NaT に強制できるようになりました。デフォルトの動作は NonExistentTimeError を発生させることのままです (GH 13057)

  • .to_hdf/read_hdf() がファイルパスとしてパスオブジェクト (例: pathlib.Path, py.path.local) を受け入れるようになりました (GH 11773)

  • pd.read_csv()engine='python' が、decimal (GH 12933)、na_filter (GH 13321)、および memory_map オプション (GH 13381) のサポートを獲得しました。

  • Python API との一貫性により、pd.read_csv()+inf を正の無限大と解釈するようになりました (GH 13274)

  • pd.read_html() が、na_values, converters, keep_default_na オプションをサポートするようになりました (GH 13461)

  • Categorical.astype() がオプションのブール引数 copy を受け入れるようになりました (dtype がカテゴリカルの場合に有効) (GH 13209)

  • DataFrame.asof() メソッドが追加され、選択されたサブセットに基づいて最後の非 NaN 値を返すようになりました (GH 13358)

  • DataFrame コンストラクターが、OrderedDict オブジェクトのリストが渡された場合にキー順序を尊重するようになりました (GH 13304)

  • pd.read_html()decimal オプションをサポートするようになりました (GH 12907)

  • Series に、Index と同様に .is_monotonic, .is_monotonic_increasing, .is_monotonic_decreasing プロパティが追加されました (GH 13336)

  • DataFrame.to_sql() が、すべての列に SQL 型として単一の値を受け入れるようになりました (GH 11886)。

  • Series.appendignore_index オプションをサポートするようになりました (GH 13677)

  • .to_stata() および StataWriter が、列名をラベルに変換する辞書を使用して、変数ラベルを Stata dta ファイルに書き込めるようになりました (GH 13535, GH 13536)

  • .to_stata() および StataWriter が、ValueError を発生させる代わりに、datetime64[ns] 列を自動的に Stata 形式 %tc に変換するようになりました (GH 12259)

  • read_stata() および StataReader が、convert_categoricals=True の場合に、繰り返し値ラベルを持つ Stata ファイルを読み込む際に、より明確なエラーメッセージでエラーを発生させるようになりました (GH 13923)

  • DataFrame.style がスパース化された MultiIndexes をレンダリングするようになりました (GH 11655)

  • DataFrame.style が列レベル名 (例: DataFrame.columns.names) を表示するようになりました (GH 13775)

  • DataFrame が、df.sort_values(by='...', axis=1) を使用して行の値に基づいて列を並べ替えるサポートを獲得しました (GH 10806)

    In [70]: df = pd.DataFrame({"A": [2, 7], "B": [3, 5], "C": [4, 8]}, index=["row1", "row2"])
    
    In [71]: df
    Out[71]: 
          A  B  C
    row1  2  3  4
    row2  7  5  8
    
    [2 rows x 3 columns]
    
    In [72]: df.sort_values(by="row2", axis=1)
    Out[72]: 
          B  A  C
    row1  3  2  4
    row2  5  7  8
    
    [2 rows x 3 columns]
    
  • I/O に、混合 dtype を持つ列の読み込みの危険性とそれへの対処法に関するドキュメントが追加されました (GH 13746)

  • to_html()border 引数が追加され、開始 <table> タグの値が制御できるようになりました。デフォルトは html.border オプションの値で、デフォルトは 1 です。これはノートブックの HTML 表現にも影響しますが、Jupyter の CSS には border-width 属性が含まれているため、視覚的な効果は同じです。 (GH 11563)。

  • sqlalchemy がインストールされておらず、接続文字列が使用されている場合に、SQL 関数で ImportError を発生させるようになりました (GH 11920)。

  • matplotlib 2.0 との互換性。以前のバージョンの pandas も matplotlib 2.0 で動作するはずです (GH 13333)

  • Timestamp, Period, DatetimeIndex, PeriodIndex および .dt アクセサに、日付が閏年に属するかどうかをチェックする .is_leap_year プロパティが追加されました。 (GH 13727)

  • astype() が、dtype 引数として列名からデータ型へのマッピングの辞書を受け入れるようになりました。 (GH 12086)

  • pd.read_jsonDataFrame.to_json が、lines オプションで JSON ラインの読み書きをサポートするようになりました。行区切り JSONを参照してください (GH 9180)

  • read_excel() が true_values および false_values キーワード引数をサポートするようになりました (GH 13347)

  • groupby() が、非 MultiIndex のグルーパーに対して level を指定するために、スカラ値と単一要素リストを受け入れるようになりました。 (GH 13907)

  • Excel の日付列内の変換できない日付は、例外を発生させるのではなく、変換されずに返され、列は object dtype になります (GH 10001)。

  • pd.Timedelta(None) が受け入れられるようになり、pd.Timestamp を模倣して NaT を返すようになりました (GH 13687)

  • pd.read_stata() が、SAS が Stata dta ファイルを生成する際に作成する一部のフォーマット 111 ファイルを処理できるようになりました (GH 11526)

  • SeriesIndexdivmod をサポートするようになり、Series または Index のタプルを返します。これは、ブロードキャスティングルールに関して標準の二項演算子のように動作します (GH 14208)。

APIの変更点#

Series.tolist() が Python 型を返すようになりました#

Series.tolist() が、NumPy の .tolist() の動作を模倣して、出力で Python 型を返すようになりました (GH 10904)

In [73]: s = pd.Series([1, 2, 3])

以前の動作:

In [7]: type(s.tolist()[0])
Out[7]:
 <class 'numpy.int64'>

新しい動作:

In [74]: type(s.tolist()[0])
Out[74]: int

異なるインデックスを持つ Series 演算子#

DataFrame を含め、すべての演算子の一貫性を保つために、以下の Series 演算子が変更されました (GH 1134, GH 4581, GH 13538)

  • Series の比較演算子が、index が異なる場合に ValueError を発生させるようになりました。

  • Series の論理演算子は、左右両側の index を揃えます。

警告

0.18.1 までは、同じ長さの Series を比較すると、.index が異なっていても成功していました (結果は .index を無視)。0.19.0 からは、より厳密にするために ValueError を発生させます。このセクションでは、以前の動作を維持したり、.eq のような柔軟な比較メソッドを使用して異なるインデックスを揃えたりする方法についても説明します。

その結果、Series および DataFrame の演算子は以下のようになります

算術演算子#

算術演算子は両方の index を揃えます (変更なし)。

In [75]: s1 = pd.Series([1, 2, 3], index=list("ABC"))

In [76]: s2 = pd.Series([2, 2, 2], index=list("ABD"))

In [77]: s1 + s2
Out[77]: 
A    3.0
B    4.0
C    NaN
D    NaN
Length: 4, dtype: float64

In [78]: df1 = pd.DataFrame([1, 2, 3], index=list("ABC"))

In [79]: df2 = pd.DataFrame([2, 2, 2], index=list("ABD"))

In [80]: df1 + df2
Out[80]: 
     0
A  3.0
B  4.0
C  NaN
D  NaN

[4 rows x 1 columns]

比較演算子#

比較演算子は、.index が異なる場合に ValueError を発生させます。

以前の動作 (Series)

Series は、両方が同じ長さである限り .index を無視して値を比較していました

In [1]: s1 == s2
Out[1]:
A    False
B     True
C    False
dtype: bool

新しい動作 (Series)

In [2]: s1 == s2
Out[2]:
ValueError: Can only compare identically-labeled Series objects

以前のバージョンと同じ結果を得るには (位置に基づいて値を比較し、.index を無視)、両方の .values を比較します。

In [81]: s1.values == s2.values
Out[81]: array([False,  True, False])

Series.index を揃えて比較したい場合は、下記の柔軟な比較メソッドのセクションを参照してください

In [82]: s1.eq(s2)
Out[82]: 
A    False
B     True
C    False
D    False
Length: 4, dtype: bool

現在の動作 (DataFrame, 変更なし)

In [3]: df1 == df2
Out[3]:
ValueError: Can only compare identically-labeled DataFrame objects

論理演算子#

論理演算子は左右両側の .index を揃えます。

以前の動作 (Series)、左側の index のみが保持されていました

In [4]: s1 = pd.Series([True, False, True], index=list('ABC'))
In [5]: s2 = pd.Series([True, True, True], index=list('ABD'))
In [6]: s1 & s2
Out[6]:
A     True
B    False
C    False
dtype: bool

新しい動作 (Series)

In [83]: s1 = pd.Series([True, False, True], index=list("ABC"))

In [84]: s2 = pd.Series([True, True, True], index=list("ABD"))

In [85]: s1 & s2
Out[85]: 
A     True
B    False
C    False
D    False
Length: 4, dtype: bool

Series 論理演算子は、NaN の結果を False で埋めます。

以前のバージョンと同じ結果 (左側のインデックスのみに基づいて値を比較) を得るには、reindex_like を使用できます

In [86]: s1 & s2.reindex_like(s1)
Out[86]: 
A     True
B    False
C    False
Length: 3, dtype: bool

現在の動作 (DataFrame, 変更なし)

In [87]: df1 = pd.DataFrame([True, False, True], index=list("ABC"))

In [88]: df2 = pd.DataFrame([True, True, True], index=list("ABD"))

In [89]: df1 & df2
Out[89]: 
       0
A   True
B  False
C  False
D  False

[4 rows x 1 columns]

柔軟な比較メソッド#

Series の柔軟な比較メソッド (例: eq, ne, le, lt, ge, gt) が、両方の index を揃えるようになりました。異なる index を持つ2つの Series を比較したい場合は、これらの演算子を使用してください。

In [90]: s1 = pd.Series([1, 2, 3], index=["a", "b", "c"])

In [91]: s2 = pd.Series([2, 2, 2], index=["b", "c", "d"])

In [92]: s1.eq(s2)
Out[92]: 
a    False
b     True
c    False
d    False
Length: 4, dtype: bool

In [93]: s1.ge(s2)
Out[93]: 
a    False
b     True
c     True
d    False
Length: 4, dtype: bool

以前は、これは比較演算子と同じように動作していました (上記を参照)。

代入時の Series 型昇格#

Series が、現在の dtype と互換性のない値で代入された場合に、その dtype を正しく昇格させるようになりました (GH 13234)

In [94]: s = pd.Series()

以前の動作:

In [2]: s["a"] = pd.Timestamp("2016-01-01")

In [3]: s["b"] = 3.0
TypeError: invalid type promotion

新しい動作:

In [95]: s["a"] = pd.Timestamp("2016-01-01")

In [96]: s["b"] = 3.0

In [97]: s
Out[97]: 
a    2016-01-01 00:00:00
b                    3.0
Length: 2, dtype: object

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

関数 .to_datetime() の変更点#

以前、.to_datetime() が混合整数/浮動小数点数と文字列に遭遇し、かつ日付時刻がなく errors='coerce' であった場合、すべてを NaT に変換していました。

以前の動作:

In [2]: pd.to_datetime([1, 'foo'], errors='coerce')
Out[2]: DatetimeIndex(['NaT', 'NaT'], dtype='datetime64[ns]', freq=None)

現在の動作:

これは、デフォルトの単位 ns で整数/浮動小数点数を変換するようになりました。

In [99]: pd.to_datetime([1, "foo"], errors="coerce")
Out[99]: DatetimeIndex(['1970-01-01 00:00:00.000000001', 'NaT'], dtype='datetime64[ns]', freq=None)

.to_datetime() に関連するバグ修正

  • 整数または浮動小数点数を渡し、unit がなく errors='coerce' の場合の pd.to_datetime() のバグ (GH 13180)。

  • 無効なデータ型 (例: bool) を渡した場合の pd.to_datetime() のバグ。今後は errors キーワードを尊重します (GH 13176)

  • int8 および int16 dtypes でオーバーフローした pd.to_datetime() のバグ (GH 13451)

  • pd.to_datetime() のバグで、NaN と他の文字列が無効な場合に errors='ignore' のときに AttributeError が発生する (GH 12424)

  • pd.to_datetime() のバグで、unit が指定されたときに浮動小数点数を正しくキャストせず、切り捨てられた日付時刻になった (GH 13834)

マージの変更点#

マージが結合キーの dtype を保持するようになりました (GH 8596)

In [100]: df1 = pd.DataFrame({"key": [1], "v1": [10]})

In [101]: df1
Out[101]: 
   key  v1
0    1  10

[1 rows x 2 columns]

In [102]: df2 = pd.DataFrame({"key": [1, 2], "v1": [20, 30]})

In [103]: df2
Out[103]: 
   key  v1
0    1  20
1    2  30

[2 rows x 2 columns]

以前の動作:

In [5]: pd.merge(df1, df2, how='outer')
Out[5]:
   key    v1
0  1.0  10.0
1  1.0  20.0
2  2.0  30.0

In [6]: pd.merge(df1, df2, how='outer').dtypes
Out[6]:
key    float64
v1     float64
dtype: object

新しい動作:

結合キーを保持できます

In [104]: pd.merge(df1, df2, how="outer")
Out[104]: 
   key  v1
0    1  10
1    1  20
2    2  30

[3 rows x 2 columns]

In [105]: pd.merge(df1, df2, how="outer").dtypes
Out[105]: 
key    int64
v1     int64
Length: 2, dtype: object

もちろん、欠損値が導入された場合は、結果の dtype はアップキャストされ、以前と変更はありません。

In [106]: pd.merge(df1, df2, how="outer", on="key")
Out[106]: 
   key  v1_x  v1_y
0    1  10.0    20
1    2   NaN    30

[2 rows x 3 columns]

In [107]: pd.merge(df1, df2, how="outer", on="key").dtypes
Out[107]: 
key       int64
v1_x    float64
v1_y      int64
Length: 3, dtype: object

メソッド .describe() の変更点#

.describe() 出力のインデックスにあるパーセンタイル識別子が、重複しないように最小限の精度に丸められるようになりました (GH 13104)

In [108]: s = pd.Series([0, 1, 2, 3, 4])

In [109]: df = pd.DataFrame([0, 1, 2, 3, 4])

以前の動作:

パーセンタイルは小数点以下1桁までに丸められていましたが、パーセンタイルが重複するとデータフレームで ValueError が発生する可能性がありました。

In [3]: s.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[3]:
count     5.000000
mean      2.000000
std       1.581139
min       0.000000
0.0%      0.000400
0.1%      0.002000
0.1%      0.004000
50%       2.000000
99.9%     3.996000
100.0%    3.998000
100.0%    3.999600
max       4.000000
dtype: float64

In [4]: df.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[4]:
...
ValueError: cannot reindex from a duplicate axis

新しい動作:

In [110]: s.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[110]: 
count     5.000000
mean      2.000000
std       1.581139
min       0.000000
0.01%     0.000400
0.05%     0.002000
0.1%      0.004000
50%       2.000000
99.9%     3.996000
99.95%    3.998000
99.99%    3.999600
max       4.000000
Length: 12, dtype: float64

In [111]: df.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[111]: 
               0
count   5.000000
mean    2.000000
std     1.581139
min     0.000000
0.01%   0.000400
0.05%   0.002000
0.1%    0.004000
50%     2.000000
99.9%   3.996000
99.95%  3.998000
99.99%  3.999600
max     4.000000

[12 rows x 1 columns]

さらに

  • 重複する percentiles を渡すと、ValueError が発生するようになりました。

  • 混合 dtype 列インデックスを持つ DataFrame での .describe() のバグで、以前は TypeError が発生していました (GH 13288)

Period の変更点#

PeriodIndexperiod dtype を持つようになりました#

PeriodIndex が独自の period dtype を持つようになりました。period dtype は、categoryタイムゾーン認識 dtype (datetime64[ns, tz]) と同様の pandas 拡張 dtype です (GH 13941)。この変更の結果、PeriodIndex は整数 dtype を持たなくなりました。

以前の動作:

In [1]: pi = pd.PeriodIndex(['2016-08-01'], freq='D')

In [2]: pi
Out[2]: PeriodIndex(['2016-08-01'], dtype='int64', freq='D')

In [3]: pd.api.types.is_integer_dtype(pi)
Out[3]: True

In [4]: pi.dtype
Out[4]: dtype('int64')

新しい動作:

In [112]: pi = pd.PeriodIndex(["2016-08-01"], freq="D")

In [113]: pi
Out[113]: PeriodIndex(['2016-08-01'], dtype='period[D]')

In [114]: pd.api.types.is_integer_dtype(pi)
Out[114]: False

In [115]: pd.api.types.is_period_dtype(pi)
Out[115]: True

In [116]: pi.dtype
Out[116]: period[D]

In [117]: type(pi.dtype)
Out[117]: pandas.core.dtypes.dtypes.PeriodDtype

Period('NaT')pd.NaT を返すようになりました#

以前、Periodpd.NaT とは異なる独自の Period('NaT') 表現を持っていました。現在、Period('NaT')pd.NaT を返すように変更されました。 (GH 12759, GH 13582)

以前の動作:

In [5]: pd.Period('NaT', freq='D')
Out[5]: Period('NaT', 'D')

新しい動作:

これらは freq オプションを指定しなくても pd.NaT を返します。

In [118]: pd.Period("NaT")
Out[118]: NaT

In [119]: pd.Period(None)
Out[119]: NaT

Period の加算および減算と互換性を持たせるため、pd.NaTint との加算および減算をサポートするようになりました。以前は ValueError を発生させていました。

以前の動作:

In [5]: pd.NaT + 1
...
ValueError: Cannot add integral value to Timestamp without freq.

新しい動作:

In [120]: pd.NaT + 1
Out[120]: NaT

In [121]: pd.NaT - 1
Out[121]: NaT

PeriodIndex.valuesPeriod オブジェクトの配列を返すようになりました#

.values が、整数の配列ではなく Period オブジェクトの配列を返すように変更されました (GH 13988)。

以前の動作:

In [6]: pi = pd.PeriodIndex(['2011-01', '2011-02'], freq='M')
In [7]: pi.values
Out[7]: array([492, 493])

新しい動作:

In [122]: pi = pd.PeriodIndex(["2011-01", "2011-02"], freq="M")

In [123]: pi.values
Out[123]: array([Period('2011-01', 'M'), Period('2011-02', 'M')], dtype=object)

インデックス + / - は集合演算に使用されなくなりました#

基本 Index 型および DatetimeIndex (数値インデックス型ではない) の加算と減算は、以前は集合演算 (集合和と差) を実行していました。この動作は 0.15.0 からすでに非推奨化されており (特定の .union() および .difference() メソッドの使用を推奨)、現在では無効になっています。可能な場合、+ および - は要素ごとの操作に使用されるようになりました。例えば、文字列の連結や日付時刻の減算などです (GH 8227, GH 14127)。

以前の動作

In [1]: pd.Index(['a', 'b']) + pd.Index(['a', 'c'])
FutureWarning: using '+' to provide set union with Indexes is deprecated, use '|' or .union()
Out[1]: Index(['a', 'b', 'c'], dtype='object')

新しい動作: 同じ操作が要素ごとの加算を実行するようになりました

In [124]: pd.Index(["a", "b"]) + pd.Index(["a", "c"])
Out[124]: Index(['aa', 'bc'], dtype='object')

数値 Index オブジェクトはすでに要素ごとの操作を実行していました。例えば、2つの整数 Index を加算する動作は変更されていません。基本 Index もこの動作と一貫性を持つようになりました。

In [125]: pd.Index([1, 2, 3]) + pd.Index([2, 3, 4])
Out[125]: Index([3, 5, 7], dtype='int64')

さらに、この変更により、2つの DatetimeIndex オブジェクトを減算して TimedeltaIndex を得ることが可能になりました

以前の動作:

In [1]: (pd.DatetimeIndex(['2016-01-01', '2016-01-02'])
   ...:  - pd.DatetimeIndex(['2016-01-02', '2016-01-03']))
FutureWarning: using '-' to provide set differences with datetimelike Indexes is deprecated, use .difference()
Out[1]: DatetimeIndex(['2016-01-01'], dtype='datetime64[ns]', freq=None)

新しい動作:

In [126]: (
   .....:     pd.DatetimeIndex(["2016-01-01", "2016-01-02"])
   .....:     - pd.DatetimeIndex(["2016-01-02", "2016-01-03"])
   .....: )
   .....: 
Out[126]: TimedeltaIndex(['-1 days', '-1 days'], dtype='timedelta64[ns]', freq=None)

Index.difference および .symmetric_difference の変更点#

Index.difference および Index.symmetric_difference が、より一貫して NaN 値を他の値と同様に扱うようになりました。 (GH 13514)

In [127]: idx1 = pd.Index([1, 2, 3, np.nan])

In [128]: idx2 = pd.Index([0, 1, np.nan])

以前の動作:

In [3]: idx1.difference(idx2)
Out[3]: Float64Index([nan, 2.0, 3.0], dtype='float64')

In [4]: idx1.symmetric_difference(idx2)
Out[4]: Float64Index([0.0, nan, 2.0, 3.0], dtype='float64')

新しい動作:

In [129]: idx1.difference(idx2)
Out[129]: Index([2.0, 3.0], dtype='float64')

In [130]: idx1.symmetric_difference(idx2)
Out[130]: Index([0.0, 2.0, 3.0], dtype='float64')

Index.unique が一貫して Index を返すようになりました#

Index.unique() が、一意の値を適切な dtypeIndex として返すようになりました (GH 13395)。以前は、ほとんどの Index クラスは np.ndarray を返し、DatetimeIndex, TimedeltaIndex, PeriodIndex はタイムゾーンなどのメタデータを保持するために Index を返していました。

以前の動作:

In [1]: pd.Index([1, 2, 3]).unique()
Out[1]: array([1, 2, 3])

In [2]: pd.DatetimeIndex(['2011-01-01', '2011-01-02',
   ...:                   '2011-01-03'], tz='Asia/Tokyo').unique()
Out[2]:
DatetimeIndex(['2011-01-01 00:00:00+09:00', '2011-01-02 00:00:00+09:00',
               '2011-01-03 00:00:00+09:00'],
              dtype='datetime64[ns, Asia/Tokyo]', freq=None)

新しい動作:

In [131]: pd.Index([1, 2, 3]).unique()
Out[131]: Index([1, 2, 3], dtype='int64')

In [132]: pd.DatetimeIndex(
   .....:     ["2011-01-01", "2011-01-02", "2011-01-03"], tz="Asia/Tokyo"
   .....: ).unique()
   .....: 
Out[132]: 
DatetimeIndex(['2011-01-01 00:00:00+09:00', '2011-01-02 00:00:00+09:00',
               '2011-01-03 00:00:00+09:00'],
              dtype='datetime64[ns, Asia/Tokyo]', freq=None)

MultiIndex コンストラクター、groupby および set_index がカテゴリカル dtypes を保持するようになりました#

MultiIndex.from_arrays および MultiIndex.from_product が、MultiIndex レベルでカテゴリカル dtype を保持するようになりました (GH 13743, GH 13854)。

In [133]: cat = pd.Categorical(["a", "b"], categories=list("bac"))

In [134]: lvl1 = ["foo", "bar"]

In [135]: midx = pd.MultiIndex.from_arrays([cat, lvl1])

In [136]: midx
Out[136]: 
MultiIndex([('a', 'foo'),
            ('b', 'bar')],
           )

以前の動作:

In [4]: midx.levels[0]
Out[4]: Index(['b', 'a', 'c'], dtype='object')

In [5]: midx.get_level_values[0]
Out[5]: Index(['a', 'b'], dtype='object')

新しい動作: 単一レベルが CategoricalIndex になりました

In [137]: midx.levels[0]
Out[137]: CategoricalIndex(['b', 'a', 'c'], categories=['b', 'a', 'c'], ordered=False, dtype='category')

In [138]: midx.get_level_values(0)
Out[138]: CategoricalIndex(['a', 'b'], categories=['b', 'a', 'c'], ordered=False, dtype='category')

MultiIndex.from_product でも同様の変更が加えられました。その結果、groupby および set_index もインデックス内のカテゴリカル dtype を保持します。

In [139]: df = pd.DataFrame({"A": [0, 1], "B": [10, 11], "C": cat})

In [140]: df_grouped = df.groupby(by=["A", "C"], observed=False).first()

In [141]: df_set_idx = df.set_index(["A", "C"])

以前の動作:

In [11]: df_grouped.index.levels[1]
Out[11]: Index(['b', 'a', 'c'], dtype='object', name='C')
In [12]: df_grouped.reset_index().dtypes
Out[12]:
A      int64
C     object
B    float64
dtype: object

In [13]: df_set_idx.index.levels[1]
Out[13]: Index(['b', 'a', 'c'], dtype='object', name='C')
In [14]: df_set_idx.reset_index().dtypes
Out[14]:
A      int64
C     object
B      int64
dtype: object

新しい動作:

In [142]: df_grouped.index.levels[1]
Out[142]: CategoricalIndex(['b', 'a', 'c'], categories=['b', 'a', 'c'], ordered=False, dtype='category', name='C')

In [143]: df_grouped.reset_index().dtypes
Out[143]: 
A       int64
C    category
B     float64
Length: 3, dtype: object

In [144]: df_set_idx.index.levels[1]
Out[144]: CategoricalIndex(['b', 'a', 'c'], categories=['b', 'a', 'c'], ordered=False, dtype='category', name='C')

In [145]: df_set_idx.reset_index().dtypes
Out[145]: 
A       int64
C    category
B       int64
Length: 3, dtype: object

関数 read_csv はチャンクを漸進的に列挙するようになりました#

read_csv()chunksize=n でインデックスを指定せずに呼び出された場合、以前は各チャンクが 0 から n-1 まで独立して生成されたインデックスを持っていました。現在は、最初のチャンクには 0 から始まり、2番目のチャンクには n から始まる漸進的なインデックスが与えられます。これにより、連結したときに chunksize= 引数なしで read_csv() を呼び出した結果と同一になります (GH 12185)。

In [146]: data = "A,B\n0,1\n2,3\n4,5\n6,7"

以前の動作:

In [2]: pd.concat(pd.read_csv(StringIO(data), chunksize=2))
Out[2]:
   A  B
0  0  1
1  2  3
0  4  5
1  6  7

新しい動作:

In [147]: pd.concat(pd.read_csv(StringIO(data), chunksize=2))
Out[147]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7

[4 rows x 2 columns]

スパースに関する変更点#

これらの変更により、pandas はより多くの dtype を持つ疎なデータを処理できるようになり、データ処理をよりスムーズにするための作業が行われました。

int64 および bool のサポート強化#

疎なデータ構造が、int64 および bool dtype のサポートを強化しました (GH 667, GH 13849)。

以前は、すべての入力が int または bool dtype であっても、疎なデータはデフォルトで float64 dtype でした。int64 dtype の疎なデータを作成するには、明示的に dtype を指定する必要がありました。また、fill_value も明示的に指定する必要がありました。これは、デフォルトが np.nan であり、int64 または bool データには存在しないためです。

In [1]: pd.SparseArray([1, 2, 0, 0])
Out[1]:
[1.0, 2.0, 0.0, 0.0]
Fill: nan
IntIndex
Indices: array([0, 1, 2, 3], dtype=int32)

# specifying int64 dtype, but all values are stored in sp_values because
# fill_value default is np.nan
In [2]: pd.SparseArray([1, 2, 0, 0], dtype=np.int64)
Out[2]:
[1, 2, 0, 0]
Fill: nan
IntIndex
Indices: array([0, 1, 2, 3], dtype=int32)

In [3]: pd.SparseArray([1, 2, 0, 0], dtype=np.int64, fill_value=0)
Out[3]:
[1, 2, 0, 0]
Fill: 0
IntIndex
Indices: array([0, 1], dtype=int32)

v0.19.0 から、疎なデータは入力 dtype を保持し、より適切な fill_value のデフォルト値を使用します (int64 dtype の場合は 0bool dtype の場合は False)。

In [148]: pd.arrays.SparseArray([1, 2, 0, 0], dtype=np.int64)
Out[148]: 
[1, 2, 0, 0]
Fill: 0
IntIndex
Indices: array([0, 1], dtype=int32)

In [149]: pd.arrays.SparseArray([True, False, False, False])
Out[149]: 
[True, False, False, False]
Fill: False
IntIndex
Indices: array([0], dtype=int32)

詳細については、ドキュメントを参照してください。

演算子が dtype を保持するようになりました#

  • 疎なデータ構造が、算術演算後に dtype を保持できるようになりました (GH 13848)

s = pd.SparseSeries([0, 2, 0, 1], fill_value=0, dtype=np.int64)
s.dtype

s + 1
  • 疎なデータ構造が、内部の dtype を変換するための astype をサポートするようになりました (GH 13900)

s = pd.SparseSeries([1.0, 0.0, 2.0, 0.0], fill_value=0)
s
s.astype(np.int64)

データが指定された dtype に変換できない値を含んでいる場合、astype は失敗します。この制限は、デフォルトが np.nan である fill_value に適用されることに注意してください。

In [7]: pd.SparseSeries([1., np.nan, 2., np.nan], fill_value=np.nan).astype(np.int64)
Out[7]:
ValueError: unable to coerce current fill_value nan to int64 dtype

その他の疎なデータに関する修正#

  • サブクラス化された SparseDataFrame および SparseSeries が、スライシングまたは転置時にクラス型を保持するようになりました。 (GH 13787)

  • bool dtype を持つ SparseArray が論理 (bool) 演算子をサポートするようになりました (GH 14000)

  • MultiIndex を持つ SparseSeries[] インデックス付けで IndexError が発生する可能性のあるバグ (GH 13144)

  • MultiIndex を持つ SparseSeries[] インデックス付けの結果が通常の Index を持つ可能性のあるバグ (GH 13144)

  • SparseDataFrameaxis=Noneaxis=0 にデフォルト設定されなかったバグ (GH 13048)

  • object dtype を持つ SparseSeries および SparseDataFrame の作成で TypeError が発生する可能性のあるバグ (GH 11633)

  • SparseDataFrame が渡された SparseArray または SparseSeries の dtype と fill_value を尊重しないバグ (GH 13866)

  • SparseArray および SparseSeriesfill_value に ufunc を適用しないバグ (GH 13853)

  • SparseSeries.abs が負の fill_value を誤って保持するバグ (GH 13853)

  • 複数型 SparseDataFrame の単一行スライシングで、以前は型が強制的に浮動小数点数に変換されていたバグ (GH 13917)

  • SparseSeries のスライシングで整数 dtype が浮動小数点数に変わるバグ (GH 8292)

  • SparseDataFarme の比較演算で TypeError が発生する可能性のあるバグ (GH 13001)

  • SparseDataFarme.isnullValueError を発生させるバグ (GH 8276)

  • bool dtype を持つ SparseSeries の表現で IndexError が発生する可能性のあるバグ (GH 13110)

  • bool または int64 dtype の SparseSeries および SparseDataFramefloat64 dtype のように値を表示する可能性のあるバグ (GH 13110)

  • bool dtype を持つ SparseArray を使用したスパースインデックス付けで誤った結果が返される可能性のあるバグ (GH 13985)

  • SparseSeries から作成された SparseArraydtype を失う可能性のあるバグ (GH 13999)

  • 疎なデータと密なデータとの SparseSeries の比較で、SparseSeries ではなく通常の Series が返されるバグ (GH 13999)

インデクサー dtype の変更#

この変更は、Windows で動作する 64 ビット Python にのみ影響し、比較的高度なインデックス操作にのみ影響します

Index.get_indexer のようにインデクサー配列を返すメソッドは、その配列を「プラットフォーム int」に強制変換し、numpy.take のようなサードパーティライブラリ操作で直接使用できるようにします。以前は、プラットフォーム int は C 整数に対応する np.int_ として定義されていましたが、正しい型 (現在使用されているもの) は、ポインタを保持できる C 整数サイズに対応する np.intp です (GH 3033, GH 13972)。

これらの型は多くのプラットフォームで同じですが、Windows の 64 ビット Python の場合、np.int_ は 32 ビットで、np.intp は 64 ビットです。この動作を変更することで、そのプラットフォームでの多くの操作のパフォーマンスが向上します。

以前の動作:

In [1]: i = pd.Index(['a', 'b', 'c'])

In [2]: i.get_indexer(['b', 'b', 'c']).dtype
Out[2]: dtype('int32')

新しい動作:

In [1]: i = pd.Index(['a', 'b', 'c'])

In [2]: i.get_indexer(['b', 'b', 'c']).dtype
Out[2]: dtype('int64')

その他の API の変更#

  • Timestamp.to_pydatetime は、warn=True で、かつインスタンスにゼロ以外のナノ秒が含まれている場合に UserWarning を発行するようになりました。以前は標準出力にメッセージが出力されていました (GH 14101)。

  • datetime とタイムゾーンを持つ Series.unique() が、タイムゾーンを持つ Timestamp の配列を返すようになりました (GH 13565)。

  • Panel.to_sparse() が呼び出されたときに NotImplementedError 例外を発生させるようになりました (GH 13778)。

  • Index.reshape() が呼び出されたときに NotImplementedError 例外を発生させるようになりました (GH 12882)。

  • .filter() がキーワード引数の相互排他性を強制するようになりました (GH 12399)。

  • evalfloat32 型のアップキャスティングルールが、NumPy のルールとより一貫するように更新されました。新しい動作では、pandas の float32 オブジェクトをスカラ float64 で乗算しても float64 にアップキャストされません (GH 12388)。

  • np.mean のような NumPy ufunc が groupby または resample オブジェクトで呼び出された場合、UnsupportedFunctionCall エラーが発生するようになりました (GH 12811)。

  • __setitem__ が、呼び出し可能な rhs を関数として適用するのではなく、そのまま格納するようになりました。以前の動作を得るには、where を直接呼び出してください (GH 13299)。

  • .sample() の呼び出しが numpy.random.seed(n) で設定された乱数シードを尊重するようになりました (GH 13161)

  • Styler.apply は、関数が返す出力に関してより厳密になりました。axis=0 または axis=1 の場合、出力の形状は同一である必要があります。axis=None の場合、出力は同一の列とインデックスラベルを持つDataFrameである必要があります (GH 13222)。

  • Float64Index.astype(int) は、Float64IndexNaN 値が含まれている場合、ValueError を発生させるようになりました (GH 13149)

  • TimedeltaIndex.astype(int) および DatetimeIndex.astype(int) は、np.array の代わりに Int64Index を返すようになりました (GH 13209)

  • 複数の頻度を持つ Period を通常の Index に渡すと、object dtype の Index が返されるようになりました (GH 13664)

  • PeriodIndex.fillna に異なる頻度を持つ Period を渡すと、object dtype に型変換されるようになりました (GH 13664)

  • DataFrame.boxplot(by=col) からのファセットボックスプロットは、return_type がNoneでない場合、Series を返すようになりました。以前は OrderedDict を返していました。なお、デフォルトである return_type=None の場合、これらは引き続き2次元NumPy配列を返します (GH 12216, GH 7096)。

  • pd.read_hdf は、r, r+, a 以外のモードが指定された場合、KeyError の代わりに ValueError を発生させるようになりました。 (GH 13623)

  • pd.read_csv(), pd.read_table(), および pd.read_hdf() は、存在しないファイルに対して呼び出された場合、Python 3.xでは組み込みの FileNotFoundError 例外を発生させます。これはPython 2.xでは IOError としてバックポートされます (GH 14086)

  • より情報量の多い例外がCSVパーサーを介して渡されるようになりました。例外タイプは、CParserError の代わりに元の例外タイプになります (GH 13652)。

  • Cエンジンにおける pd.read_csv() は、sep でエンコードされた文字が1文字より長い場合、ParserWarning を発行するか、ValueError を発生させるようになりました (GH 14065)

  • DataFrame.values は、int64uint64 の混在するdtypesを持つ DataFramefloat64 を返すようになり、np.find_common_type に準拠するようになりました (GH 10364, GH 13917)

  • .groupby.groups は、np.ndarray または list の辞書ではなく、Index オブジェクトの辞書を返すようになりました (GH 14293)

非推奨#

  • Series.reshapeCategorical.reshape は非推奨となり、今後のリリースで削除されます (GH 12882, GH 12882)

  • PeriodIndex.to_datetimePeriodIndex.to_timestamp の代わりに非推奨となりました (GH 8254)

  • Timestamp.to_datetimeTimestamp.to_pydatetime の代わりに非推奨となりました (GH 8254)

  • Index.to_datetime および DatetimeIndex.to_datetimepd.to_datetime の代わりに非推奨となりました (GH 8254)

  • pandas.core.datetools モジュールは非推奨となり、今後のリリースで削除されます (GH 14094)

  • SparseList は非推奨となり、将来のバージョンで削除されます (GH 13784)

  • DataFrame.to_html() および DataFrame.to_latex() は、colSpace パラメータを col_space のために削除しました (GH 13857)

  • DataFrame.to_sql() は、SQLAlchemyがインストールされていない場合に不要であるため、flavor パラメータを非推奨としました (GH 13611)

  • read_csv キーワードが非推奨になりました

    • compact_intsuse_unsigned は非推奨となり、将来のバージョンで削除されます (GH 13320)

    • buffer_lines は非推奨となり、将来のバージョンで削除されます (GH 13360)

    • as_recarray は非推奨となり、将来のバージョンで削除されます (GH 13373)

    • skip_footerskipfooter のために非推奨となり、将来のバージョンで削除されます (GH 13349)

  • トップレベルの pd.ordered_merge()pd.merge_ordered() に名称変更され、元の名称は将来のバージョンで削除されます (GH 13358)

  • Timestamp.offset プロパティ (およびコンストラクタの命名引数) は freq のために非推奨となりました (GH 12160)

  • pd.tseries.util.pivot_annual は非推奨です。代わりに pivot_table を使用してください。例はこちらです (GH 736)

  • pd.tseries.util.isleapyear は非推奨となり、今後のリリースで削除されます。Datetime-likeオブジェクトは .is_leap_year プロパティを持つようになりました (GH 13727)

  • Panel4D および PanelND コンストラクタは非推奨となり、将来のバージョンで削除されます。これらのタイプのn次元データを表現する推奨される方法は、xarrayパッケージを使用することです。pandasは、この変換を自動化するための to_xarray() メソッドを提供します (GH 13564)。

  • pandas.tseries.frequencies.get_standard_freq は非推奨です。代わりに pandas.tseries.frequencies.to_offset(freq).rule_code を使用してください (GH 13874)

  • pandas.tseries.frequencies.to_offsetfreqstr キーワードは freq のために非推奨となりました (GH 13874)

  • Categorical.from_array は非推奨となり、将来のバージョンで削除されます (GH 13854)

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

  • SparsePanel クラスは削除されました (GH 13778)

  • pd.sandbox モジュールは、外部ライブラリ pandas-qt のために削除されました (GH 13670)

  • pandas.io.data および pandas.io.wb モジュールは、pandas-datareaderパッケージのために削除されました (GH 13724)。

  • pandas.tools.rplot モジュールは、seabornパッケージのために削除されました (GH 13855)

  • DataFrame.to_csv() は、0.17.1で非推奨となった engine パラメータを削除しました (GH 11274, GH 13419)

  • DataFrame.to_dict() は、outtype パラメータを orient のために削除しました (GH 13627, GH 8486)

  • pd.Categorical は、ordered 属性の直接設定を廃止し、set_ordered メソッドを推奨するようになりました (GH 13671)

  • pd.Categorical は、levels 属性を廃止し、categories を推奨するようになりました (GH 8376)

  • DataFrame.to_sql() は、flavor パラメータの mysql オプションを削除しました (GH 13611)

  • Panel.shift() は、lags パラメータを periods のために削除しました (GH 14041)

  • pd.Index は、diff メソッドを difference のために削除しました (GH 13669)

  • pd.DataFrame は、to_wide メソッドを to_panel のために削除しました (GH 14039)

  • Series.to_csv は、nanRep パラメータを na_rep のために削除しました (GH 13804)

  • Series.xs, DataFrame.xs, Panel.xs, Panel.major_xs, および Panel.minor_xscopy パラメータを削除しました (GH 13781)

  • str.splitreturn_type パラメータを expand のために削除しました (GH 13701)

  • レガシータイムルール (オフセットエイリアス) の削除。0.17.0以降非推奨 (0.8.0以降エイリアス) (GH 13590, GH 13868)。現在、レガシータイムルールは ValueError を発生させます。現在サポートされているオフセットのリストについては、こちらを参照してください。

  • DataFrame.plot.box および DataFrame.boxplotreturn_type パラメータのデフォルト値が None から "axes" に変更されました。これらのメソッドは、デフォルトでアーティストの辞書ではなくmatplotlib軸を返すようになりました。こちらを参照してください (GH 6581)。

  • pandas.io.sql モジュール内の tquery および uquery 関数は削除されました (GH 5950)。

パフォーマンス改善#

  • 疎な IntIndex.intersect のパフォーマンスが向上しました (GH 13082)

  • ブロック数が多い場合の BlockIndex を使用した疎な算術演算のパフォーマンスが向上しましたが、このような場合は IntIndex の使用が推奨されます (GH 13082)

  • DataFrame.quantile() のパフォーマンスが向上しました。これは、ブロックごとに動作するようになったためです (GH 11623)

  • float64ハッシュテーブル操作のパフォーマンスが向上し、Python 3での非常に遅いインデックス作成およびgroupby操作が修正されました (GH 13166, GH 13334)

  • DataFrameGroupBy.transform のパフォーマンスが向上しました (GH 12737)

  • Index および Series.duplicated のパフォーマンスが向上しました (GH 10235)

  • Index.difference のパフォーマンスが向上しました (GH 12044)

  • RangeIndex.is_monotonic_increasing および is_monotonic_decreasing のパフォーマンスが向上しました (GH 13749)

  • DatetimeIndex における日時文字列解析のパフォーマンスが向上しました (GH 13692)

  • Period のハッシュ化のパフォーマンスが向上しました (GH 12817)

  • タイムゾーン付きの日時データの factorize のパフォーマンスが向上しました (GH 13750)

  • より大きなインデックスでインデックスハッシュテーブルを遅延作成することにより、パフォーマンスが向上しました (GH 14266)

  • groupby.groups のパフォーマンスが向上しました (GH 14293)

  • メモリ使用量を内省する際にMultiIndexを不必要に具体化していました (GH 14308)

バグ修正#

  • 欠損値を持つ列でグループ化する際、まれにセグメンテーション違反や破損を引き起こす可能性のある groupby().shift() のバグを修正しました (GH 13813)

  • axis=1 の場合に cumprod を計算する groupby().cumsum() のバグを修正しました。 (GH 13994)

  • pd.to_timedelta()errors パラメータが尊重されていなかったバグを修正しました (GH 13613)

  • io.json.json_normalize() で、非ASCIIキーが例外を発生させていたバグを修正しました (GH 13213)

  • デフォルトでインデックス付けされていない Series.plot()xerr または yerr として渡す際のバグを修正しました (GH 11858)

  • サブプロットが有効な場合、または凡例がプロット後に移動された場合に、エリアプロットが凡例を誤って描画するバグを修正しました (エリアプロットの凡例を正しく描画するにはmatplotlib 1.5.0が必要です) (GH 9161, GH 13544)

  • object-dtyped Index を持つ DataFrame の代入で、結果の列が元のオブジェクトに対して変更可能であったバグを修正しました。 (GH 13522)

  • matplotlib AutoDataFormatter のバグを修正しました。これにより、第2スケールのフォーマットが復元され、マイクロ秒スケールのフォーマットが再追加されます (GH 13131)

  • 固定形式の HDFStore から start および/または stop が指定された選択を行う際のバグを修正し、選択された範囲が返されるようになりました (GH 8287)

  • Categorical.from_codes() で無効な ordered パラメータが渡された場合に、役立たないエラーが発生していたバグを修正しました (GH 14058)

  • Windowsで整数タプルから Series を構築する際にデフォルトのdtype (int64) が返されなかったバグを修正しました (GH 13646)

  • Datetime-likeオブジェクトとの TimedeltaIndex 加算でオーバーフローが捕捉されていなかったバグを修正しました (GH 14068)

  • 同じオブジェクトが複数回呼び出されたときの .groupby(..).resample(..) のバグを修正しました (GH 13174)

  • インデックス名がユニコード文字列の場合の .to_records() のバグを修正しました (GH 13172)

  • 実装されていないオブジェクトに対して .memory_usage() を呼び出す際のバグを修正しました (GH 12924)

  • NaNを含む Series.quantile の回帰を修正しました (これは .median() および .describe() でも発生していました)。さらに、Series には分位点を含む名前が付けられるようになりました (GH 13098, GH 13146)

  • 日時値と欠損グループを持つ SeriesGroupBy.transform のバグを修正しました (GH 13191)

  • 空の Series が日時のような数値演算で誤って型変換されていたバグを修正しました (GH 13844)

  • タイムゾーン付き日時を含む Categorical が渡された場合の Categorical コンストラクタのバグを修正しました (GH 14190)

  • str インデックスを持つ Series.str.extractall()ValueError を発生させていたバグを修正しました (GH 13156)

  • 単一グループと量指定子を持つ Series.str.extractall() のバグを修正しました (GH 13382)

  • DatetimeIndexPeriod の減算が TypeError ではなく ValueError または AttributeError を発生させていたバグを修正しました (GH 13078)

  • NaNNaT が混在するデータで作成された Index および Seriesdatetime64 dtype を持たない場合があったバグを修正しました (GH 13324)

  • Index および Seriesnp.datetime64('nat') および np.timdelta64('nat') を無視してdtypeを推測する場合があったバグを修正しました (GH 13324)

  • PeriodIndexPeriod の減算が AttributeError を発生させていたバグを修正しました (GH 13071)

  • 特定の状況で PeriodIndex の構築が float64 インデックスを返していたバグを修正しました (GH 13067)

  • 空の場合に PeriodIndex を持つ .resample(..) が適切に freq を変更していなかったバグを修正しました (GH 13067)

  • 空の場合に PeriodIndex を持つ .resample(..) が空の DataFrame で適切にそのタイプまたは名前を保持していなかったバグを修正しました (GH 13212)

  • 渡された関数がグループごとにスカラ値を返す場合の groupby(..).apply(..) のバグを修正しました (GH 13468)。

  • いくつかのキーワードを渡すと例外が発生する groupby(..).resample(..) のバグを修正しました (GH 13235)

  • 正しい結果を得るためにインデックスがソートされていることに依存していたtz-aware DateTimeIndex.tz_convert のバグを修正しました (GH 13306)

  • dateutil.tz.tzlocal を使用した .tz_localize が誤った結果を返す場合があるバグを修正しました (GH 13583)

  • DatetimeTZDtype dtype が dateutil.tz.tzlocal で有効なdtypeと見なされなかったバグを修正しました (GH 13583)

  • pd.read_hdf() で、単一のデータセットを持つHDFファイルを読み込もうとした際に、1つ以上のカテゴリ列があり、キー引数がデータセット名に設定されていないと失敗するバグを修正しました (GH 13231)

  • .rolling() で、Rolling() オブジェクトの構築時に負の整数ウィンドウが許可され、その後の集計で失敗していたバグを修正しました (GH 13383)

  • 数値インデックスとタプル値データを持つ Series のインデックス作成のバグを修正しました (GH 13509)

  • pd.DataFrame の印刷で、object dtype を持つ珍しい要素がセグメンテーション違反を引き起こしていたバグを修正しました (GH 13717)

  • Series のランク付けでセグメンテーション違反が発生する可能性があったバグを修正しました (GH 13445)

  • 渡されたインデックスの名前が伝播されなかった、様々なインデックスタイプのバグを修正しました (GH 12309)

  • DatetimeIndexcopy=True が尊重されていなかったバグを修正しました (GH 13205)

  • DatetimeIndex.is_normalized がローカルタイムゾーンの場合に正規化された日付範囲に対して誤った値を返していたバグを修正しました (GH 13459)

  • pd.concat および .appenddatetime64 および timedelta を、Timestamp または Timedelta ではなく、Python組み込みの datetime または timedelta を含む object dtype に型変換する可能性があるバグを修正しました (GH 13626)

  • 結果が object dtype の場合に PeriodIndex.appendAttributeError を発生させる場合があったバグを修正しました (GH 13221)

  • CategoricalIndex.append が通常の list を受け入れる場合があったバグを修正しました (GH 13626)

  • 同じタイムゾーンを持つ pd.concat.append がUTCにリセットされるバグを修正しました (GH 7795)

  • データにDST境界付近の日時が含まれる場合、Series および DataFrame.appendAmbiguousTimeError を発生させるバグを修正しました (GH 13626)

  • DataFrame.to_csv() で、数値以外の値にのみ引用符が指定されているにもかかわらず、浮動小数点値が引用符で囲まれて出力されていたバグを修正しました (GH 12922, GH 13259)

  • ブール値の列のみを含む DataFrame.describe()ValueError を発生させていたバグを修正しました (GH 13898)

  • MultiIndex スライスで、レベルが非ユニークな場合に余分な要素が返されていたバグを修正しました (GH 12896)

  • .str.replace が無効な置換に対して TypeError を発生させなかったバグを修正しました (GH 13438)

  • MultiIndex.from_arrays で入力配列の長さが一致するかどうかをチェックしていなかったバグを修正しました (GH 13599)

  • cartesian_product および MultiIndex.from_product で空の入力配列で発生する可能性があったバグを修正しました (GH 12258)

  • pd.read_csv() で、まれな状況でストリーム/ファイルを大きなチャンクで反復処理する際に、セグメンテーション違反または破損を引き起こす可能性があったバグを修正しました (GH 13703)

  • pd.read_csv() で、スカラを含む辞書が na_values として渡された場合にエラーが発生していたバグを修正しました (GH 12224)

  • pd.read_csv() で、BOMファイルを無視せずに誤って解析していたバグを修正しました (GH 4793)

  • engine='python' を使用した pd.read_csv() で、numpy配列が usecols として渡された場合にエラーが発生していたバグを修正しました (GH 12546)

  • pd.read_csv() で、thousands パラメータと共に日付として解析される場合に、インデックス列が誤って解析されていたバグを修正しました (GH 14066)

  • engine='python' を使用した pd.read_csv() で、データが数値に変換された後に NaN 値が検出されなかったバグを修正しました (GH 13314)

  • pd.read_csv() で、nrows 引数が両方のエンジンで適切に検証されていなかったバグを修正しました (GH 10476)

  • engine='python' を使用した pd.read_csv() で、混合ケース形式の無限大が適切に解釈されていなかったバグを修正しました (GH 13274)

  • engine='python' を使用した pd.read_csv() で、末尾の NaN 値が解析されていなかったバグを修正しました (GH 13320)

  • Python 3のWindowsで tempfile.TemporaryFile から読み込む際の pd.read_csv()engine='python' を使用する際のバグを修正しました (GH 13398)

  • pd.read_csv()usecols kwargがシングルバイトのUnicode文字列を受け付けなかったバグを修正しました (GH 13219)

  • pd.read_csv()usecols が空のセットであることを妨げていたバグを修正しました (GH 13402)

  • Cエンジンにおける pd.read_csv() で、NULL文字がNULLとして解析されていなかったバグを修正しました (GH 14012)

  • engine='c' を使用した pd.read_csv() で、quotingNone として指定されていたにもかかわらず、NULL quotechar が受け入れられなかったバグを修正しました (GH 13411)

  • engine='c' を使用した pd.read_csv() で、引用符が数値以外として指定された場合にフィールドが適切にfloatにキャストされなかったバグを修正しました (GH 13411)

  • Python 2.xで非UTF8エンコードの複数文字区切りデータを持つ pd.read_csv() のバグを修正しました (GH 3404)

  • pd.read_csv() で、utf-xx (例: UTF-xx, UTF_xx, utf_xx) のエイリアスがUnicodeDecodeErrorを発生させていたバグを修正しました (GH 13549)

  • pd.read_csv, pd.read_table, pd.read_fwf, pd.read_stata および pd.read_sas で、chunksizeiterator の両方が None の場合に、パーサーによってファイルが開かれたまま閉じられないバグを修正しました。 (GH 13940)

  • StataReader, StataWriter, XportReader および SAS7BDATReader で、エラーが発生した場合にファイルが適切に閉じられなかったバグを修正しました。 (GH 13940)

  • pd.pivot_table() で、aggfunc がリストの場合に margins_name が無視されていたバグを修正しました (GH 13354)

  • pd.Series.str.zfill, center, ljust, rjust, および pad で、非整数を渡した場合に TypeError が発生しなかったバグを修正しました (GH 13598)

  • TimedeltaIndex 内のNULLオブジェクトのチェックが常に True を返していたバグを修正しました (GH 13603)

  • Series の算術演算で、object dtype として日時のような値が含まれている場合に TypeError が発生していたバグを修正しました (GH 13043)

  • Series.isnull() および Series.notnull()Period('NaT') を無視していたバグを修正しました (GH 13737)

  • Series.fillna() および Series.dropna()Period('NaT') に影響を与えなかったバグを修正しました (GH 13737

  • .fillna(value=np.nan)category dtyped Series で誤って KeyError を発生させていたバグを修正しました (GH 14021)

  • 拡張dtype作成で、作成された型が同一でなかったバグを修正しました (GH 13285)

  • .resample(..) で、IPythonの内省によって誤った警告がトリガーされていたバグを修正しました (GH 13618)

  • NaT - PeriodAttributeError を発生させていたバグを修正しました (GH 13071)

  • rhsに NaT が含まれている場合、Series の比較が誤った結果を出力する可能性があったバグを修正しました (GH 9005)

  • object dtypeを持つ NaT が含まれている場合、Series および Index の比較が誤った結果を出力する可能性があったバグを修正しました (GH 13592)

  • 右辺に Period がある場合、Period の加算が TypeError を発生させていたバグを修正しました (GH 13069)

  • PeriodSeries または Index の比較が TypeError を発生させていたバグを修正しました (GH 13200)

  • pd.set_eng_float_format() がNaNとInfのフォーマットを妨げていたバグを修正しました (GH 11981)

  • Categorical dtype を持つ .unstack.orderedTrue にリセットしていたバグを修正しました (GH 13249)

  • 日時解析におけるいくつかのコンパイル時警告をクリーンアップしました (GH 13607)

  • データにDST境界付近の日時が含まれる場合、factorizeAmbiguousTimeError を発生させていたバグを修正しました (GH 13750)

  • 新しいインデックスがDST境界と複数レベルを含む場合、.set_indexAmbiguousTimeError を発生させていたバグを修正しました (GH 12920)

  • データにDST境界付近の日時が含まれる場合、.shiftAmbiguousTimeError を発生させていたバグを修正しました (GH 13926)

  • pd.read_hdf() が、categorical 列を持つ DataFrame と、値に一致しないクエリがある場合に誤った結果を返していたバグを修正しました (GH 13792)

  • 非lexsortedなMultiIndexでインデックスを作成する際の .iloc のバグを修正しました (GH 13797)

  • 逆ソートされた DatetimeIndex で日付文字列を使用してインデックスを作成する際の .loc のバグを修正しました (GH 14316)

  • ゼロ次元NumPy配列を扱う際の Series 比較演算子のバグを修正しました (GH 13006)

  • .combine_first が誤った dtype を返す場合があったバグを修正しました (GH 7630, GH 10567)

  • groupby で、最初の結果が None かどうかによって apply が異なる結果を返していたバグを修正しました (GH 12824)

  • .head()/.tail() の後に呼び出された場合、グループキーが矛盾して含まれる groupby(..).nth() のバグを修正しました (GH 12839)

  • .to_html, .to_latex および .to_string が、formatters キーワードを介して渡されたカスタム日時フォーマッタを黙って無視していたバグを修正しました (GH 10690)

  • DataFrame.iterrows() で、定義されている場合に Series のサブクラスを生成しなかったバグを修正しました (GH 13977)

  • errors='coerce' で入力にハッシュ不可能なオブジェクトが含まれている場合の pd.to_numeric のバグを修正しました (GH 13324)

  • 無効な Timedelta の算術演算と比較が TypeError ではなく ValueError を発生させる場合があったバグを修正しました (GH 13624)

  • to_datetime および DatetimeIndex での無効な日時解析が ValueError ではなく TypeError を発生させる場合があったバグを修正しました (GH 11169, GH 11287)

  • tz-aware Timestamp と不一致の tz オプションで作成された Index がタイムゾーンを誤って型変換していたバグを修正しました (GH 13692)

  • ナノ秒頻度を持つ DatetimeIndexend で指定されたタイムスタンプを含まなかったバグを修正しました (GH 13672)

  • np.timedelta64 を使用してスライスを設定する際の Series のバグを修正しました (GH 14155)

  • Indexobject dtype に型変換するのではなく、datetimedatetime64[ns] 境界を超える場合に OutOfBoundsDatetime を発生させていたバグを修正しました (GH 13663)

  • Indexdtype として渡された指定された datetime64 または timedelta64 を無視する可能性があったバグを修正しました (GH 13981)

  • RangeIndexTypeError を発生させるのではなく、引数なしで作成できるバグを修正しました (GH 13793)

  • データが datetime64[ns] 境界を超える場合、.value_counts()OutOfBoundsDatetime を発生させていたバグを修正しました (GH 13663)

  • 入力 np.datetime64ns 以外の単位を持つ場合、DatetimeIndexOutOfBoundsDatetime を発生させる可能性があったバグを修正しました (GH 9114)

  • ns 以外の単位を持つ np.datetime64object dtype として使用して Series を作成すると、誤った値になるバグを修正しました (GH 13876)

  • timedeltaデータでデータがfloatにキャストされていた resample のバグを修正しました (GH 13119)。

  • 入力日時のようなオブジェクトが ns 以外の単位を持つ場合、pd.isnull() pd.notnull()TypeError を発生させていたバグを修正しました (GH 13389)

  • 入力日時のようなオブジェクトが ns 以外の単位を持つ場合、pd.merge()TypeError を発生させる場合があったバグを修正しました (GH 13389)

  • HDFStore/read_hdf()tz が設定されている場合に DatetimeIndex.name を破棄していたバグを修正しました (GH 13884)

  • Categorical.remove_unused_categories().codes のdtypeをプラットフォームのintに変更していたバグを修正しました (GH 13261)

  • as_index=False を持つ groupby が、カテゴリカルな列を含む複数の列でグループ化する際にすべてのNaNを返していたバグを修正しました (GH 13204)

  • df.groupby(...)[...]Int64Index でgetitemを実行するとエラーが発生していたバグを修正しました (GH 13731)

  • DataFrame.style に割り当てられるCSSクラスのインデックス名のバグを修正しました。以前は "col_heading level<n> col<c>" が割り当てられていましたが、n はレベル数+1でした。現在は "index_name level<n>" が割り当てられており、n はそのMultiIndexの正しいレベルです。

  • pd.read_gbq() が、apiclientという別のpythonパッケージとの命名競合の結果、ImportError: No module named discovery をスローする可能性があったバグを修正しました (GH 13454)

  • Index.union が、名前付きの空のインデックスで誤った結果を返していたバグを修正しました (GH 13432)

  • Index.differenceおよびDataFrame.joinのバグにより、混合整数インデックスを使用している場合にPython3でエラーが発生します (GH 13432, GH 12814)。

  • タイムゾーン対応のdatetime.datetimeをタイムゾーン対応のdatetime64シリーズから減算する際のバグ (GH 14088)。

  • DataFrameにNaN値を持つラベルを含むMultiIndexが含まれる場合に.to_excel()のバグ (GH 13511)。

  • "D1"、"-2-3H"などの無効な頻度オフセット文字列がValueErrorを発生させない可能性があるバグ (GH 13930)。

  • RangeIndexレベルを持つ階層フレームでのconcatおよびgroupbyのバグ (GH 13542)。

  • object dtypeのNaN値のみを含むSeriesに対するSeries.str.contains()のバグ (GH 14171)。

  • groupby dataframeのagg()関数がdatetime64[ns]列のdtypeをfloat64に変更するバグ (GH 12821)。

  • PeriodIndexでNumPy ufuncを使用して整数を加算または減算するとIncompatibleFrequencyが発生するバグ。標準演算子の方が効率的なパスを使用するため、+-などの標準演算子を使用することを推奨します (GH 13980)。

  • NaTに対する操作がdatetime64[ns]ではなくfloatを返すバグ (GH 12941)。

  • Seriesの柔軟な算術メソッド(.add()など)がaxis=Noneの場合にValueErrorを発生させるバグ (GH 13894)。

  • MultiIndex列を持つDataFrame.to_csv()で余分な空行が追加されるバグ (GH 6618)。

  • DatetimeIndexTimedeltaIndexPeriodIndex.equals()が、入力がIndexではないが同じ値を含む場合にTrueを返す可能性があるバグ (GH 13107)。

  • タイムゾーン付きの日時への代入が、夏時間境界付近の日時を含む場合に機能しない可能性があるバグ (GH 14146)。

  • Python 2で長い浮動小数点リテラルが切り捨てられるpd.eval()およびHDFStoreクエリのバグ (GH 14241)。

  • 列がdfに存在せず、列に重複値が含まれる場合に、Indexが誤った列を表示してKeyErrorを発生させるバグ (GH 13822)。

  • 頻度が結合オフセットエイリアスを持つ場合にPeriodおよびPeriodIndexが誤った日付を作成するバグ (GH 13874)。

  • 整数line_widthindex=Falseを指定して.to_string()を呼び出すと、代入前にidxが参照されるためUnboundLocalError例外が発生するバグ。

  • eval()resolvers引数がリストを受け付けないバグ (GH 14095)。

  • stackget_dummiesmake_axis_dummiesが(マルチ)インデックス内のカテゴリdtypeを保持しないバグ (GH 13854)。

  • PeriodIndexは、pd.NaTを含むlistおよびarrayを受け入れるようになりました (GH 13430)。

  • グループ化されたDataFrameに空のビンが含まれる場合に、df.groupby.median()が任意の値を返すバグ (GH 13629)。

  • Index.copy()nameパラメータが無視されるバグ (GH 14302)。

貢献者#

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

  • Adrien Emery +

  • Alex Alekseyev

  • Alex Vig +

  • Allen Riddell +

  • Amol +

  • Amol Agrawal +

  • Andy R. Terrel +

  • Anthonios Partheniou

  • Ben Kandel +

  • Bob Baxley +

  • Brett Rosen +

  • Camilo Cota +

  • Chris

  • Chris Grinolds

  • Chris Warth

  • Christian Hudon

  • Christopher C. Aycock

  • Daniel Siladji +

  • Douglas McNeil

  • Drewrey Lupton +

  • Eduardo Blancas Reyes +

  • Elliot Marsden +

  • エヴァン・ライト

  • Felix Marczinowski +

  • Francis T. O’Donovan

  • Geraint Duck +

  • Giacomo Ferroni +

  • Grant Roch +

  • Gábor Lipták

  • Haleemur Ali +

  • Hassan Shamim +

  • Iulius Curt +

  • Ivan Nazarov +

  • ジェフ・リーバック

  • Jeffrey Gerard +

  • Jenn Olsen +

  • Jim Crist

  • Joe Jevnik

  • John Evans +

  • John Freeman

  • John Liekezer +

  • John W. O’Brien

  • John Zwinck +

  • Johnny Gill +

  • Jordan Erenrich +

  • Joris Van den Bossche

  • Josh Howes +

  • Jozef Brandys +

  • カ・ウォ・チェン

  • Kamil Sindi +

  • カービー・シェデン

  • Kernc +

  • ケビン・シェパード

  • Matthieu Brucher +

  • Maximilian Roos

  • Michael Scherer +

  • Mike Graham +

  • モルタダ・メヒヤル

  • Muhammad Haseeb Tariq +

  • Nate George +

  • Neil Parley +

  • Nicolas Bonnotte

  • OXPHOS

  • Pan Deng / Zora +

  • Paul +

  • Paul Mestemaker +

  • Pauli Virtanen

  • Pawel Kordek +

  • ピエトロ・バティストン

  • Piotr Jucha +

  • Ravi Kumar Nimmi +

  • Robert Gieseke

  • Robert Kern +

  • ロジャー・トーマス

  • Roy Keyes +

  • Russell Smith +

  • Sahil Dua +

  • Sanjiv Lobo +

  • Sašo Stanovnik +

  • Shawn Heide +

  • Sinhrks

  • Stephen Kappel +

  • Steve Choi +

  • Stewart Henderson +

  • Sudarshan Konge +

  • トーマス・A・キャスウェル

  • Tom Augspurger

  • Tom Bird +

  • Uwe Hoffmann +

  • WillAyd +

  • Xiang Zhang +

  • YG-Riku +

  • Yadunandan +

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

  • Yuichiro Kaneko +

  • adneu

  • agraboso +

  • babakkeyvani +

  • c123w +

  • クリス・B1

  • cmazzullo +

  • conquistador1492 +

  • cr3 +

  • dsm054

  • ジーエフヤング

  • harshul1610 +

  • iamsimha +

  • jackieleng +

  • mpuels +

  • pijucha +

  • priyankjain +

  • sinhrks

  • wcwagner +

  • yui-knk +

  • zhangjinjie +

  • znmean +

  • 颜发才(Yan Facai) +