2.2.0の新機能 (2024年1月19日)#

これらはpandas 2.2.0の変更点です。pandasの他のバージョンを含む完全な変更ログは、リリースノートをご覧ください。

pandas 3.0での今後の変更点#

pandas 3.0では、pandasのデフォルト動作に2つの大きな変更がもたらされます。

Copy-on-Write#

現在オプションであるCopy-on-Writeモードが、pandas 3.0でデフォルトで有効になります。現在の動作を維持するオプションはなくなります。新しい動作セマンティクスは、Copy-on-Writeに関するユーザーガイドで説明されています。

新しい動作は、pandas 2.0以降、以下のオプションで有効にできます。

pd.options.mode.copy_on_write = True

この変更は、コピーとビューに関してpandasがどのように動作するかに異なる変更をもたらします。これらの変更の一部は、チェーン割り当ての変更のように明確な非推奨化を可能にします。他の変更はより微妙であり、そのため、警告はpandas 2.2で有効にできるオプションの背後に隠されています。

pd.options.mode.copy_on_write = "warn"

このモードは、ほとんどのクエリには実際には関係のない多くの異なるシナリオで警告を発します。このモードを試すことをお勧めしますが、これらの警告をすべて取り除く必要はありません。移行ガイドでアップグレードプロセスがより詳しく説明されています。

専用の文字列データ型 (Arrowによるサポート) がデフォルトに#

これまで、pandasは文字列列をNumPyのオブジェクトデータ型で表現していました。この表現には、パフォーマンスの遅さや大きなメモリフットプリントなど、多くの問題がありました。これはpandas 3.0で変更されます。pandasは、文字列列をArrowでサポートされた新しいstringデータ型として推論するようになります。これにより、パフォーマンスとメモリ使用量が大幅に改善されます。

以前の動作

In [1]: ser = pd.Series(["a", "b"])
Out[1]:
0    a
1    b
dtype: object

新しい動作

In [1]: ser = pd.Series(["a", "b"])
Out[1]:
0    a
1    b
dtype: string

これらのシナリオで使用される文字列データ型は、欠損値のセマンティクスやこれらの列に対する一般的な操作を含め、ほとんどNumPyのオブジェクトと同じように動作します。

この変更には、API全体でいくつかの追加変更が含まれます。

  • 現在、dtype="string"を指定すると、NumPy配列に保存されるPython文字列によってサポートされるdtypeが作成されます。これはpandas 3.0で変更され、このdtypeはArrowによってサポートされる文字列列を作成します。

  • 列名とインデックスもArrow文字列によってサポートされます。

  • この変更に対応するため、pandas 3.0ではPyArrowが必須の依存関係になります。

この将来のdtype推論ロジックは、以下で有効にできます。

pd.options.future.infer_string = True

機能強化#

to_sql および read_sql での ADBC ドライバーのサポート#

read_sql()to_sql() は、Apache Arrow ADBC ドライバーで動作するようになりました。SQLAlchemy を介して使用される従来のドライバーと比較して、ADBC ドライバーは大幅なパフォーマンス向上、より優れた型サポート、よりクリーンな NULL 処理を提供します。

import adbc_driver_postgresql.dbapi as pg_dbapi

df = pd.DataFrame(
    [
        [1, 2, 3],
        [4, 5, 6],
    ],
    columns=['a', 'b', 'c']
)
uri = "postgresql://postgres:postgres@localhost/postgres"
with pg_dbapi.connect(uri) as conn:
    df.to_sql("pandas_table", conn, index=False)

# for round-tripping
with pg_dbapi.connect(uri) as conn:
    df2 = pd.read_sql("pandas_table", conn)

Arrow 型システムは、PostgreSQL のようなデータベースが提供できるものとより密接に一致する、より広範な型を提供します。例として、さまざまなデータベースと pandas バックエンドで利用できる型の (網羅的ではない) リストを示します。

numpy/pandas

arrow

postgres

sqlite

int16/Int16

int16

SMALLINT

INTEGER

int32/Int32

int32

INTEGER

INTEGER

int64/Int64

int64

BIGINT

INTEGER

float32

float32

REAL

REAL

float64

float64

DOUBLE PRECISION

REAL

object

string

TEXT

TEXT

bool

bool_

BOOLEAN

datetime64[ns]

timestamp(us)

TIMESTAMP

datetime64[ns,tz]

timestamp(us,tz)

TIMESTAMPTZ

date32

DATE

month_day_nano_interval

INTERVAL

binary

BINARY

BLOB

decimal128

DECIMAL [1]

list

ARRAY [1]

struct

COMPOSITE TYPE

[1]

脚注

DataFrameのライフサイクル全体でデータベース型を可能な限り維持することに関心があるユーザーは、read_sql()dtype_backend="pyarrow"引数を活用することをお勧めします。

# for round-tripping
with pg_dbapi.connect(uri) as conn:
    df2 = pd.read_sql("pandas_table", conn, dtype_backend="pyarrow")

これにより、データが従来のpandas/NumPy型システムに変換されるのを防ぎます。これにより、SQL型がラウンドトリップできない方法で変換されることがよくあります。

ADBC ドライバーとその開発状況の完全なリストについては、ADBC Driver Implementation Status ドキュメントを参照してください。

1つ以上の条件に基づいてpandas Seriesを作成する#

Series.case_when()関数が、1つ以上の条件に基づいてSeriesオブジェクトを作成するために追加されました。(GH 39154)

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(dict(a=[1, 2, 3], b=[4, 5, 6]))

In [3]: default=pd.Series('default', index=df.index)

In [4]: default.case_when(
   ...:      caselist=[
   ...:          (df.a == 1, 'first'),                              # condition, replacement
   ...:          (df.a.gt(1) & df.b.eq(5), 'second'),  # condition, replacement
   ...:      ],
   ...: )
   ...: 
Out[4]: 
0      first
1     second
2    default
dtype: object

NumPyのNULL許容型およびArrow型に対するto_numpyは、適切なNumPy dtypeに変換されます#

NumPyのNULL許容型およびArrow型に対するto_numpyは、NULL許容型およびPyArrowでサポートされる拡張dtypeの場合、object dtypeの代わりに適切なNumPy dtypeに変換されるようになりました。

以前の動作

In [1]: ser = pd.Series([1, 2, 3], dtype="Int64")
In [2]: ser.to_numpy()
Out[2]: array([1, 2, 3], dtype=object)

新しい動作

In [5]: ser = pd.Series([1, 2, 3], dtype="Int64")

In [6]: ser.to_numpy()
Out[6]: array([1, 2, 3])

In [7]: ser = pd.Series([1, 2, 3], dtype="timestamp[ns][pyarrow]")

In [8]: ser.to_numpy()
Out[8]: 
array(['1970-01-01T00:00:00.000000001', '1970-01-01T00:00:00.000000002',
       '1970-01-01T00:00:00.000000003'], dtype='datetime64[ns]')

デフォルトのNumPy dtype (引数なし) は次のように決定されます。

  • float dtypeはNumPy floatにキャストされます

  • 欠損値のない整数dtypeはNumPy整数dtypeにキャストされます

  • 欠損値のある整数dtypeはNumPy float dtypeにキャストされ、NaNが欠損値インジケータとして使用されます

  • 欠損値のないブールdtypeはNumPy bool dtypeにキャストされます

  • 欠損値のあるブールdtypeはobject dtypeを保持します

  • datetimeおよびtimedelta型はそれぞれNumPy datetime64およびtimedelta64型にキャストされ、NaTが欠損値インジケータとして使用されます

PyArrow構造化データ用のSeries.structアクセサー#

Series.structアクセサーは、struct[pyarrow] dtypeのSeriesデータを処理するための属性とメソッドを提供します。たとえば、Series.struct.explode()は、PyArrow構造化データをpandas DataFrameに変換します。(GH 54938)

In [9]: import pyarrow as pa

In [10]: series = pd.Series(
   ....:     [
   ....:         {"project": "pandas", "version": "2.2.0"},
   ....:         {"project": "numpy", "version": "1.25.2"},
   ....:         {"project": "pyarrow", "version": "13.0.0"},
   ....:     ],
   ....:     dtype=pd.ArrowDtype(
   ....:         pa.struct([
   ....:             ("project", pa.string()),
   ....:             ("version", pa.string()),
   ....:         ])
   ....:     ),
   ....: )
   ....: 

In [11]: series.struct.explode()
Out[11]: 
   project version
0   pandas   2.2.0
1    numpy  1.25.2
2  pyarrow  13.0.0

Series.struct.field()を使用して、(ネストされている可能性のある)構造体フィールドにインデックスを付けます。

In [12]: series.struct.field("project")
Out[12]: 
0     pandas
1      numpy
2    pyarrow
Name: project, dtype: string[pyarrow]

PyArrowリストデータ用のSeries.listアクセサー#

Series.listアクセサーは、list[pyarrow] dtypeのSeriesデータを処理するための属性とメソッドを提供します。例えば、Series.list.__getitem__()を使用すると、Series内のpyarrowリストにインデックスを付けることができます。(GH 55323)

In [13]: import pyarrow as pa

In [14]: series = pd.Series(
   ....:     [
   ....:         [1, 2, 3],
   ....:         [4, 5],
   ....:         [6],
   ....:     ],
   ....:     dtype=pd.ArrowDtype(
   ....:         pa.list_(pa.int64())
   ....:     ),
   ....: )
   ....: 

In [15]: series.list[0]
Out[15]: 
0    1
1    4
2    6
dtype: int64[pyarrow]

read_excel() 用の Calamine エンジン#

read_excel()calamine エンジンが追加されました。これは、Rust ライブラリ calamine の Python バインディングを提供する python-calamine を使用します。このエンジンは、Excel ファイル (.xlsx, .xlsm, .xls, .xlsb) および OpenDocument スプレッドシート (.ods) をサポートします (GH 50395)。

このエンジンには2つの利点があります。

  1. Calamine は他のエンジンよりも高速なことが多く、一部のベンチマークでは 'openpyxl' より最大 5 倍、'odf' より 20 倍、'pyxlsb' より 4 倍、'xlrd' より 1.5 倍高速な結果が示されています。ただし、'openpyxl' と 'pyxlsb' は、行の遅延イテレーションのため、大きなファイルから少数の行を読み取る場合は高速です。

  2. Calamine は .xlsb ファイルの datetime の認識をサポートしています。これは、pandas で .xlsb ファイルを読み取れる唯一の他のエンジンである 'pyxlsb' とは異なります。

pd.read_excel("path_to_file.xlsb", engine="calamine")

詳細については、IO ツールのユーザーガイドの Calamine (Excel および ODS ファイル) を参照してください。

その他の機能強化#

  • method パラメータを multi に設定した to_sql() が Oracle バックエンドで動作するようになりました。

  • Series.attrs / DataFrame.attrs は、attrs を伝播するためにディープコピーを使用するようになりました (GH 54134)。

  • get_dummies() は、入力 dtype と互換性のある拡張 dtype boolean または bool[pyarrow] を返すようになりました (GH 56273)。

  • read_csv()engine="pyarrow" とともに on_bad_lines パラメータをサポートするようになりました (GH 54480)。

  • read_sas() は、SAS にネイティブに保存されているものとより一致する解像度を持つ datetime64 dtypes を返すようになり、datetime64[ns] dtype で保存できない場合に object-dtype を返すことを避けるようになりました (GH 56127)。

  • read_spss() は、メタデータを DataFrame.attrs に保存する DataFrame を返すようになりました (GH 54264)。

  • tseries.api.guess_datetime_format() が公開 API の一部となりました (GH 54727)。

  • DataFrame.apply() は、numba の使用 (via engine="numba") を許可し、渡された関数を JIT コンパイルすることで、潜在的な高速化を可能にします (GH 54666)。

  • ExtensionArray._explode()インターフェースメソッドが追加され、explodeメソッドの拡張型実装が可能になりました。(GH 54833)

  • ExtensionArray.duplicated()が追加され、duplicatedメソッドの拡張型実装が可能になりました。(GH 55255)

  • Series.ffill(), Series.bfill(), DataFrame.ffill(), および DataFrame.bfill()limit_area 引数が追加されました。サードパーティの ExtensionArray 作者は、この引数を _pad_or_backfill メソッドに追加する必要があります (GH 56492)。

  • read_excel()engine_kwargs を使用して、read_onlydata_onlykeep_links 引数を openpyxl に渡せるようになりました (GH 55027)。

  • ArrowDtype およびマスクされたdtypeに対して Series.interpolate() および DataFrame.interpolate() を実装しました (GH 56267)。

  • Series.value_counts() のマスクされたアルゴリズムを実装しました (GH 54984)。

  • ArrowDtypepyarrow.duration 型の Series.dt() メソッドと属性を実装しました (GH 52284)。

  • ArrowDtypeSeries.str.extract() を実装しました (GH 56268)。

  • DatetimeIndex.to_period() で、期間頻度としてサポートされていない頻度 (例: "BMS") を指定した場合に表示されるエラーメッセージを改善しました (GH 56243)。

  • "QS"のような無効なオフセットでPeriodを構築する際のエラーメッセージを改善しました。(GH 55785)

  • string[pyarrow]string[pyarrow_numpy] の両方の dtype が、長い列でのオーバーフローを避けるために PyArrow の large_string 型を利用するようになりました (GH 56259)。

注目すべきバグ修正#

これらは、注目すべき動作変更をもたらす可能性のあるバグ修正です。

merge()DataFrame.join() が、ドキュメント化されたソート動作を一貫して従うようになりました#

以前のバージョンのpandasでは、merge()DataFrame.join()は、ドキュメント化されたソート動作に従った結果を常に返すとは限りませんでした。pandasは、mergeおよびjoin操作でドキュメント化されたソート動作に従うようになりました。(GH 54611, GH 56426, GH 56443)。

ドキュメントに記載されているように、sort=Trueは、結果のDataFrameで結合キーを辞書順にソートします。sort=Falseの場合、結合キーの順序は結合タイプ (howキーワード) に依存します。

  • how="left": 左キーの順序を保持します。

  • how="right": 右キーの順序を保持します。

  • how="inner": 左キーの順序を保持します。

  • how="outer": キーを辞書順にソートします。

動作が変更される例として、一意ではない左結合キーとsort=Falseを持つ内部結合があります。

In [16]: left = pd.DataFrame({"a": [1, 2, 1]})

In [17]: right = pd.DataFrame({"a": [1, 2]})

In [18]: result = pd.merge(left, right, how="inner", on="a", sort=False)

以前の動作

In [5]: result
Out[5]:
   a
0  1
1  1
2  2

新しい動作

In [19]: result
Out[19]: 
   a
0  1
1  2
2  1

レベルが異なる場合、merge()DataFrame.join() はレベルを並べ替えなくなりました#

以前のバージョンのpandasでは、merge()DataFrame.join()は、異なるレベルを持つ2つのインデックスを結合する際にインデックスレベルを並べ替えることがありました。(GH 34133)

In [20]: left = pd.DataFrame({"left": 1}, index=pd.MultiIndex.from_tuples([("x", 1), ("x", 2)], names=["A", "B"]))

In [21]: right = pd.DataFrame({"right": 2}, index=pd.MultiIndex.from_tuples([(1, 1), (2, 2)], names=["B", "C"]))

In [22]: left
Out[22]: 
     left
A B      
x 1     1
  2     1

In [23]: right
Out[23]: 
     right
B C       
1 1      2
2 2      2

In [24]: result = left.join(right)

以前の動作

In [5]: result
Out[5]:
       left  right
B A C
1 x 1     1      2
2 x 2     1      2

新しい動作

In [25]: result
Out[25]: 
       left  right
A B C             
x 1 1     1      2
  2 2     1      2

依存関係の最小バージョン引き上げ#

オプションの依存関係の場合、一般的な推奨事項は最新バージョンを使用することです。最低テストバージョンよりも古いオプションの依存関係は動作する可能性がありますが、サポート対象とはみなされません。次の表は、最低テストバージョンが引き上げられたオプションの依存関係を示しています。

パッケージ

新しい最小バージョン

beautifulsoup4

4.11.2

blosc

1.21.3

bottleneck

1.3.6

fastparquet

2022.12.0

fsspec

2022.11.0

gcsfs

2022.11.0

lxml

4.9.2

matplotlib

3.6.3

numba

0.56.4

numexpr

2.8.4

qtpy

2.3.0

openpyxl

3.1.0

psycopg2

2.9.6

pyreadstat

1.2.0

pytables

3.8.0

pyxlsb

1.0.10

s3fs

2022.11.0

scipy

1.10.0

sqlalchemy

2.0.0

表計算

0.9.0

xarray

2022.12.0

xlsxwriter

3.0.5

zstandard

0.19.0

pyqt5

5.15.8

tzdata

2022.7

詳細については、依存関係 および オプションの依存関係 を参照してください。

その他の API の変更#

  • ハッシュ操作のパフォーマンスを向上させるため、NULL許容拡張dtypeのハッシュ値が変更されました。(GH 56507)

  • testing.assert_frame_equal() および testing.assert_series_equal() において、check_exact は浮動小数点 dtype に対してのみ有効になりました。特に、整数 dtype は常に厳密にチェックされます (GH 55882)。

非推奨#

チェーン割り当て#

pandas 3.0 (Copy-on-Write (CoW), PDEP-7) におけるコピー/ビュー動作への今後の大きな変更に備え、*チェーン割り当て*の非推奨化を開始しました。

チェーン割り当ては、2つの連続するインデックス操作を介してpandas DataFrameまたはSeriesを更新しようとするときに発生します。操作の種類と順序によっては、現在これが機能する場合としない場合があります。

典型的な例は次のとおりです。

df = pd.DataFrame({"foo": [1, 2, 3], "bar": [4, 5, 6]})

# first selecting rows with a mask, then assigning values to a column
# -> this has never worked and raises a SettingWithCopyWarning
df[df["bar"] > 5]["foo"] = 100

# first selecting the column, and then assigning to a subset of that column
# -> this currently works
df["foo"][df["bar"] > 5] = 100

この2番目のチェーン割り当ての例は、現在、元のdfを更新するために機能します。これはpandas 3.0では機能しなくなり、したがって私たちはこれを非推奨化し始めました。

>>> df["foo"][df["bar"] > 5] = 100
FutureWarning: ChainedAssignmentError: behaviour will change in pandas 3.0!
You are setting values through chained assignment. Currently this works in certain cases, but when using Copy-on-Write (which will become the default behaviour in pandas 3.0) this will never work to update the original DataFrame or Series, because the intermediate object on which we are setting values will behave as a copy.
A typical example is when you are setting values in a column of a DataFrame, like:

df["col"][row_indexer] = value

Use `df.loc[row_indexer, "col"] = values` instead, to perform the assignment in a single step and ensure this keeps updating the original `df`.

See the caveats in the documentation: https://pandas.dokyumento.jp/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

チェーン割り当ての使用を削除することで、この警告を修正し、コードがpandas 3.0に対応していることを確認できます。通常、これは例えば.locを使用して、割り当てを1ステップで行うことで可能です。上記の例では、次のようにできます。

df.loc[df["bar"] > 5, "foo"] = 100

同様の非推奨化は、次のようなチェーンされた方法で行われるインプレースメソッドにも適用されます。

>>> df["foo"].fillna(0, inplace=True)
FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.

目的がDataFrame df の列を更新することである場合、ここでの代替手段は、df.fillna({"foo": 0}, inplace=True) のように df 自体でメソッドを呼び出すことです。

詳細は移行ガイドをご覧ください。

オフセットに対する MQY などのエイリアスを MEQEYE などに非推奨化#

以下の頻度エイリアスは非推奨になりました。(GH 9586)

オフセット

非推奨エイリアス

新しいエイリアス

MonthEnd

M

ME

BusinessMonthEnd

BM

BME

SemiMonthEnd

SM

SME

CustomBusinessMonthEnd

CBM

CBME

QuarterEnd

Q

QE

BQuarterEnd

BQ

BQE

YearEnd

Y

YE

BYearEnd

BY

BYE

例えば

以前の動作:

In [8]: pd.date_range('2020-01-01', periods=3, freq='Q-NOV')
Out[8]:
DatetimeIndex(['2020-02-29', '2020-05-31', '2020-08-31'],
              dtype='datetime64[ns]', freq='Q-NOV')

将来の動作:

In [26]: pd.date_range('2020-01-01', periods=3, freq='QE-NOV')
Out[26]: DatetimeIndex(['2020-02-29', '2020-05-31', '2020-08-31'], dtype='datetime64[ns]', freq='QE-NOV')

自動ダウンキャストの非推奨化#

いくつかのメソッドにおけるobject dtype結果の自動ダウンキャストが非推奨になりました。これは、動作が値に依存するため、予測が困難な方法でdtypeをサイレントに変更することがありました。さらに、pandasはサイレントなdtype変更から移行しています。(GH 54710, GH 54261)

これらのメソッドは以下のとおりです。

将来の現在の動作を再現するには、DataFrame.infer_objects() を明示的に呼び出してください。

result = result.infer_objects(copy=False)

または、astype を使用して、すべて丸められた浮動小数点数を整数に明示的にキャストします。

将来の動作を選択するには、以下のオプションを設定します。

In [9]: pd.set_option("future.no_silent_downcasting", True)

その他の非推奨化#

  • Timedelta.resolution_string() は、頻度エイリアスにおけるそれぞれの非推奨化との互換性のために、HTSLUN の代わりに hminsmsusns を返すように変更されました (GH 52536)。

  • offsets.Day.delta, offsets.Hour.delta, offsets.Minute.delta, offsets.Second.delta, offsets.Milli.delta, offsets.Micro.delta, offsets.Nano.delta は非推奨になりました。代わりに pd.Timedelta(obj) を使用してください (GH 55498)。

  • pandas.api.types.is_interval()pandas.api.types.is_period() は非推奨になりました。代わりに isinstance(obj, pd.Interval)isinstance(obj, pd.Period) を使用してください (GH 55264)。

  • read_gbq() および DataFrame.to_gbq() は非推奨になりました。代わりに pandas_gbq.read_gbq および pandas_gbq.to_gbq を使用してください https://pandas-gbq.readthedocs.io/en/latest/api.html (GH 55525)。

  • DataFrameGroupBy.fillna() および SeriesGroupBy.fillna() は非推奨になりました。前方および後方補完には DataFrameGroupBy.ffill()DataFrameGroupBy.bfill() を、単一値で補完するには DataFrame.fillna() (またはSeries相当) を使用してください (GH 55718)。

  • DateOffset.is_anchored() は非推奨になりました。Tick 以外のサブクラスの場合は obj.n == 1 を使用してください (Tick の場合は常に False でした) (GH 55388)。

  • DatetimeArray.__init__() および TimedeltaArray.__init__() は非推奨になりました。代わりに array() を使用してください (GH 55623)。

  • Index.format() は非推奨になりました。代わりに index.astype(str) または index.map(formatter) を使用してください (GH 55413)。

  • Series.ravel() は非推奨になりました。基になる配列はすでに1Dであるため、ravelは不要です (GH 52511)。

  • Series.resample()DataFrame.resample()PeriodIndex (および 'convention' キーワード) とともに使用することは非推奨になりました。代わりに、リサンプリングする前に DatetimeIndex に変換 (.to_timestamp() を使用) してください (GH 53481)。

  • Series.view() は非推奨になりました。dtypeを変更するには、代わりに Series.astype() を使用してください (GH 20251)。

  • offsets.Tick.is_anchored() は非推奨になりました。代わりに False を使用してください (GH 55388)。

  • core.internals メンバー BlockExtensionBlockDatetimeTZBlock は非推奨になりました。代わりにパブリック API を使用してください (GH 55139)。

  • PeriodIndex コンストラクタにおける yearmonthquarterdayhourminutesecond キーワードは非推奨になりました。代わりに PeriodIndex.from_fields() を使用してください (GH 55960)。

  • Index.view() で型を引数として渡すことは非推奨になりました。代わりに引数なしで呼び出してください (GH 55709)。

  • date_range()timedelta_range()period_range()、および interval_range() で非整数 periods 引数を許可することは非推奨になりました (GH 56036)。

  • DataFrame.to_clipboard() において、キーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_csv() において、path_or_buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_dict() において、キーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_excel() において、excel_writer 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_gbq() において、destination_table 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_hdf() において、path_or_buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_html() において、buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_json() において、path_or_buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_latex() において、buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_markdown() において、buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_parquet() において、path 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_pickle() において、path 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_string() において、buf 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrame.to_xml() において、path_or_buffer 以外のキーワード引数以外の引数を許可することは非推奨になりました (GH 54229)。

  • DataFrameBlockManager オブジェクトを、SeriesSingleBlockManager オブジェクトを渡すことは非推奨になりました (GH 52419)。

  • オブジェクトdtypeインデックスを持つIndex.insert()の動作は非推奨になりました。これは結果に対してサイレントに型推論を実行します。古い動作を維持するには、代わりにresult.infer_objects(copy=False)を明示的に呼び出してください。(GH 51363)

  • Series.isin() および Index.isin() で、datetime64timedelta64、および PeriodDtype dtype を持つ非datetimeライクな値 (主に文字列) をキャストすることは非推奨になりました (GH 53111)。

  • pandas入力を与えた場合のIndexSeriesDataFrameコンストラクタにおけるdtype推論は非推奨になりました。現在の動作を維持するには、入力に対して.infer_objectsを呼び出してください。(GH 56012)

  • DataFrameIndexを設定する際のdtype推論は非推奨になりました。代わりに明示的にキャストしてください。(GH 56102)

  • DataFrameGroupBy.apply()DataFrameGroupBy.resample() を使用する際に、グループを計算に含めることは非推奨になりました。グループを除外するには include_groups=False を渡してください (GH 7155)。

  • 長さゼロのブールインデクサでIndexをインデックス付けすることは非推奨になりました。(GH 55820)

  • 長さ1のリストライクでグループ化する際に、DataFrameGroupBy.get_group または SeriesGroupBy.get_group にタプルを渡さないことは非推奨になりました (GH 25971)。

  • YearBegin における頻度を示す文字列 AS、および様々な会計年度開始日を持つ年次頻度を示す文字列 AS-DECAS-JAN などは非推奨になりました (GH 54275)。

  • YearEnd における頻度を示す文字列 A、および様々な会計年度末日を持つ年次頻度を示す文字列 A-DECA-JAN などは非推奨になりました (GH 54275)。

  • BYearBegin における頻度を示す文字列 BAS、および様々な会計年度開始日を持つ年次頻度を示す文字列 BAS-DECBAS-JAN などは非推奨になりました (GH 54275)。

  • BYearEnd における頻度を示す文字列 BA、および様々な会計年度末日を持つ年次頻度を示す文字列 BA-DECBA-JAN などは非推奨になりました (GH 54275)。

  • HourBusinessHourCustomBusinessHour における頻度を示す文字列 HBH、および CBH は非推奨になりました (GH 52536)。

  • to_timedelta()における単位を示す文字列 HSUNは非推奨になりました。(GH 52536)

  • Timedeltaにおける単位を示す文字列 HTSLUNは非推奨になりました。(GH 52536)

  • MinuteSecondMilliMicroNano における頻度を示す文字列 TSLU、および N は非推奨になりました (GH 52536)。

  • read_csv() で、keep_date_col キーワードとともに解析された datetime 列を結合するサポートは非推奨になりました (GH 55569)。

  • DataFrameGroupBy.grouperSeriesGroupBy.grouper は非推奨になりました。これらの属性は将来のバージョンのpandasで削除されます (GH 56521)。

  • Grouping 属性の group_indexresult_index、および group_arraylike は非推奨になりました。これらは将来のバージョンのpandasで削除されます (GH 56148)。

  • read_csv() および read_table()delim_whitespace キーワードは非推奨になりました。代わりに sep="\\s+" を使用してください (GH 55569)。

  • to_datetime()to_timedelta()、および to_numeric() における errors="ignore" オプションは非推奨になりました。代わりに明示的に例外を捕捉してください (GH 54467)。

  • Series コンストラクタにおける fastpath キーワードは非推奨になりました (GH 20110)。

  • Series.resample() および DataFrame.resample() における kind キーワードは非推奨になりました。代わりにオブジェクトの index を明示的にキャストしてください (GH 55895)。

  • PeriodIndex における ordinal キーワードは非推奨になりました。代わりに PeriodIndex.from_ordinals() を使用してください (GH 55960)。

  • TimedeltaIndex の構築における unit キーワードは非推奨になりました。代わりに to_timedelta() を使用してください (GH 55499)。

  • read_csv() および read_table()verbose キーワードが非推奨になりました (GH 55569)

  • DataFrame.replace() および Series.replace()CategoricalDtype を伴う動作が非推奨になりました。将来のバージョンでは、replace はカテゴリを保持したまま値を変更します。カテゴリを変更するには、代わりに ser.cat.rename_categories を使用してください (GH 55147)

  • Series.value_counts() および Index.value_counts() のオブジェクト dtype を伴う動作が非推奨になりました。将来のバージョンでは、これらは結果の Index に対して dtype 推論を実行しません。古い動作を保持するには、result.index = result.index.infer_objects() を実行してください (GH 56161)

  • DataFrame.pivot_table()observed=False のデフォルトが非推奨になりました。将来のバージョンでは True になります (GH 56236)

  • 拡張テストクラス BaseNoReduceTestsBaseBooleanReduceTests、および BaseNumericReduceTests が非推奨になりました。代わりに BaseReduceTests を使用してください (GH 54663)

  • オプション mode.data_manager および ArrayManager が非推奨になりました。将来のバージョンでは BlockManager のみが利用可能になります (GH 55043)

  • DataFrame.stack の以前の実装が非推奨になりました。将来のバージョンを採用するには future_stack=True を指定してください (GH 53515)

パフォーマンス改善#

バグ修正#

カテゴリカル#

  • 重複する Interval 値を含むカテゴリカルデータで Categorical.isin()InvalidIndexError を発生させるバグ (GH 34974)

  • 混合型の順序なしカテゴリカルデータに対して CategoricalDtype.__eq__()False を返すバグ (GH 55468)

  • pa.DictionaryArray をカテゴリとして使用して pa.dictionaryCategoricalDtype にキャストする際のバグ (GH 56672)

日付時刻ライク#

  • DatetimeIndex の構築で、tzdayfirst または yearfirst の両方を渡すと dayfirst/yearfirst が無視されるバグ (GH 55813)

  • DatetimeIndex で、float オブジェクトのオブジェクト dtype ndarray と tz を渡すと、結果が誤ってローカライズされるバグ (GH 55780)

  • Series.isin() で、DatetimeTZDtype dtype と比較値がすべて NaT の場合に、シリーズに NaT エントリが含まれていても、誤ってすべて False を返すバグ (GH 56427)

  • concat() で、すべての NA DataFrame を DatetimeTZDtype dtype DataFrame と連結すると AttributeError が発生するバグ (GH 52093)

  • testing.assert_extension_array_equal() で、解像度を比較する際に間違った単位を使用する可能性があるバグ (GH 55730)

  • to_datetime() および DatetimeIndex で、混合文字列型と数値型のリストを渡すと誤って例外が発生するバグ (GH 55780)

  • to_datetime() および DatetimeIndex で、タイムゾーンの混合またはタイムゾーン認識の混合を持つ混合型オブジェクトを渡すと ValueError が発生しないバグ (GH 55693)

  • 非常に大きなティックを持つ Tick.delta()OutOfBoundsTimedelta ではなく OverflowError を発生させるバグ (GH 55503)

  • ナノ秒以外の解像度を持つ DatetimeIndex.shift() が、誤ってナノ秒解像度で返すバグ (GH 56117)

  • DatetimeIndex.union() が、同じタイムゾーンだが異なる単位を持つ tz-aware インデックスに対してオブジェクト dtype を返すバグ (GH 55238)

  • Index.is_monotonic_increasing() および Index.is_monotonic_decreasing() が、インデックスの最初の値が NaT の場合に Index.is_unique() を常に True としてキャッシュするバグ (GH 55755)

  • Index.view() で、サポートされていない解像度を持つ datetime64 dtype にビューイングすると誤って例外が発生するバグ (GH 55710)

  • Series.dt.round() で、ナノ秒以外の解像度と NaT エントリを持つ場合に、誤って OverflowError が発生するバグ (GH 56158)

  • Series.fillna() で、ナノ秒以外の解像度 dtype と高解像度のベクトル値を持つ場合に、誤った (内部的に破損した) 結果が返されるバグ (GH 56410)

  • ISO8601 形式の分または時間解像度とタイムゾーンオフセットを持つ文字列から Timestamp.unit() が誤って推論されるバグ (GH 56208)

  • .astype で高解像度の datetime64 dtype から低解像度の datetime64 dtype (例: datetime64[us]->datetime64[ms]) に変換する際に、下限実装値付近の値でサイレントにオーバーフローするバグ (GH 55979)

  • ナノ秒以外の解像度を持つ datetime64 SeriesIndex、または DataFrame 列に Week オフセットを加算または減算すると、誤った結果が返されるバグ (GH 55583)

  • ナノ秒以外の IndexSeries、または DataFrame 列に offset 属性を持つ BusinessDay オフセットを加算または減算すると、誤った結果が返されるバグ (GH 55608)

  • マイクロ秒コンポーネントを持つ DateOffset オブジェクトを、ナノ秒以外の解像度を持つ datetime64 IndexSeries、または DataFrame 列に加算または減算する際のバグ (GH 55595)

  • 非常に大きな Tick オブジェクトを Timestamp または Timedelta オブジェクトに加算または減算すると OutOfBoundsTimedelta ではなく OverflowError が発生するバグ (GH 55503)

  • ナノ秒以外の DatetimeTZDtype と、ナノ秒解像度では範囲外となる入力値を使用して IndexSeries、または DataFrame を作成すると、誤って OutOfBoundsDatetime が発生するバグ (GH 54620)

  • ナノ秒以外の datetime64 (または DatetimeTZDtype) を持つ IndexSeries、または DataFrame を、混合数値入力から作成する際に、それらを dtype の単位の倍数としてではなく (混合されていない数値入力の場合に発生する) ナノ秒として扱うバグ (GH 56004)

  • ナノ秒以外の datetime64 dtype と、datetime64[ns] では範囲外となる入力値を使用して IndexSeries、または DataFrame を作成すると、誤って OutOfBoundsDatetime が発生するバグ (GH 55756)

  • ナノ秒解像度で非 ISO8601 形式の datetime 文字列を解析すると、マイクロ秒未満のコンポーネントが誤って切り捨てられるバグ (GH 56051)

  • 秒未満の解像度と末尾のゼロを持つ datetime 文字列を解析すると、秒またはミリ秒の解像度が誤って推論されるバグ (GH 55737)

  • unitTimestamp のポイントごとの結果と一致しない浮動小数点 dtype 引数を持つ to_datetime() の結果におけるバグ (GH 56037)

  • 異なる解像度を持つ datetime64 列を連結する際に concat() がエラーを発生させる回帰バグを修正 (GH 53641)

Timedelta#

  • Timedelta 構築で OutOfBoundsTimedelta ではなく OverflowError を発生させるバグ (GH 55503)

  • ナノ秒以外の解像度を持つ timedelta64 値と、すべて 24 時間の倍数であるエントリを持つ TimedeltaIndex および Series のレンダリング (__repr__) で、ナノ秒の場合に使用されるコンパクトな表現を使用できないバグ (GH 55405)

タイムゾーン#

  • AbstractHolidayCalendar で、祝日を計算する際にタイムゾーンデータが伝播されないバグ (GH 54580)

  • Timestamp 構築で、曖昧な値と pytz タイムゾーンを使用すると pytz.AmbiguousTimeError が発生しないバグ (GH 55657)

  • Timestamp.tz_localize() で、DST 中の UTC+0 付近で nonexistent="shift_forward を使用する際のバグ (GH 51501)

数値#

変換#

  • DataFrame.astype() で、unpickled 配列に対して str を指定して呼び出すと、配列がインプレースで変更される可能性があるバグ (GH 54654)

  • DataFrame.astype() で、errors="ignore" が拡張型に対して効果がなかったバグ (GH 54654)

  • Series.convert_dtypes() が、すべての NA 列を null[pyarrow] に変換しないバグ (GH 55346)

  • :meth:DataFrame.loc が、異なる dtype の Series を全列セッターを使用して割り当てる際に「互換性のない dtype 警告」 (詳細は PDEP6 参照) をスローしなかったバグ (例: df.loc[:, 'a'] = incompatible_value) (GH 39584)

文字列#

Interval#

  • Interval__repr__ が、Timestamp の境界に対する UTC オフセットを表示しないバグ。さらに、時、分、秒のコンポーネントも表示されるようになりました (GH 55015)

  • IntervalIndex.factorize() および Series.factorize() で、datetime64 または timedelta64 間隔を持つ IntervalDtype がナノ秒以外の単位を保持しないバグ (GH 56099)

  • IntervalIndex.from_arrays() に、解像度が一致しない datetime64 または timedelta64 配列を渡すと、無効な IntervalArray オブジェクトが構築されるバグ (GH 55714)

  • IntervalIndex.from_tuples() で、サブタイプが NULL 許容拡張 dtype の場合に例外が発生するバグ (GH 56765)

  • IntervalIndex.get_indexer() で、datetime または timedelta 間隔が整数ターゲットと誤って一致するバグ (GH 47772)

  • IntervalIndex.get_indexer() で、タイムゾーン対応 datetime 間隔がタイムゾーン非対応ターゲットのシーケンスと誤って一致するバグ (GH 47772)

  • IntervalIndex を持つ Series にスライスを使用して値を設定すると、誤って例外が発生するバグ (GH 54722)

インデックス付け#

欠損値#

MultiIndex#

I/O#

  • read_csv() で、engine="python"skiprows が指定された場合に chunksize 引数を尊重しなかったバグ (GH 56323)

  • read_csv() で、engine="python" が呼び出し可能な skiprows とチャンクサイズが指定された場合に TypeError を引き起こすバグ (GH 55677)

  • read_csv() で、on_bad_lines="warn" が Python 警告を発生させる代わりに stderr に書き込んでいたバグ。これは現在 errors.ParserWarning を生成します (GH 54296)

  • read_csv()engine="pyarrow" を使用すると quotechar が無視されるバグ (GH 52266)

  • read_csv()engine="pyarrow" を使用すると、ヘッダーのない CSV で usecols が機能しなかったバグ (GH 54459)

  • read_excel() で、engine="xlrd" (xls ファイル) を使用すると、ファイルに NaN または Inf が含まれている場合にエラーが発生するバグ (GH 54564)

  • read_json() で、infer_string が設定されている場合に dtype 変換を適切に処理しないバグ (GH 56195)

  • DataFrame.to_excel() で、OdsWriter (ods ファイル) がブール値/文字列値を書き込むバグ (GH 54994)

  • DataFrame.to_hdf() および read_hdf() で、ナノ秒以外の解像度を持つ datetime64 dtypes が正しくラウンドトリップしないバグ (GH 55622)

  • DataFrame.to_stata() が拡張 dtypes に対して例外を発生させるバグ (GH 54671)

  • read_excel()engine="odf" (ods ファイル) を使用すると、文字列セルにアノテーションが含まれている場合に発生するバグ (GH 55200)

  • read_excel() で、浮動小数点値のキャッシュされた書式付きセルがない ODS ファイルを使用するバグ (GH 55219)

  • DataFrame.to_json() がサポートされていない NumPy 型で TypeError ではなく OverflowError を発生させるバグ (GH 55403)

期間#

  • PeriodIndex 構築で、dataordinal、および **fields のうち 2 つ以上が渡された場合に ValueError が発生しないバグ (GH 55961)

  • Period の加算で、OverflowError を発生させる代わりにサイレントにラップアラウンドするバグ (GH 55503)

  • astype を使用して PeriodDtype からナノ秒以外の単位を持つ datetime64 または DatetimeTZDtype にキャストする際に、誤ってナノ秒単位で返されるバグ (GH 55958)

プロット#

Groupby/resample/rolling#

再整形#

スパース#

  • arrays.SparseArray.take() が配列の埋め込み値とは異なる埋め込み値を使用する際に発生するバグ (GH 55181)

その他#

  • DataFrame.__dataframe__() が pyarrow large strings をサポートしていないバグ (GH 56702)

  • DataFrame.describe() において、結果のパーセンタイルをフォーマットする際に、99.999% のパーセンタイルが 100% に丸められるバグ (GH 55765)

  • api.interchange.from_dataframe() が空の文字列列を処理する際に NotImplementedError を発生させるバグ (GH 56703)

  • cut() および qcut() が、非ナノ秒単位の datetime64 dtype 値を持つ場合に、誤ってナノ秒単位のビンを返すバグ (GH 56101)

  • cut() が、タイムゾーン対応の datetime をタイムゾーン非対応のビンで誤ってカットすることを許可するバグ (GH 54964)

  • infer_freq() および DatetimeIndex.inferred_freq() が、週次頻度と非ナノ秒分解能を使用する際に発生するバグ (GH 55609)

  • DataFrame.apply() において、raw=True を渡すと、適用された関数に渡された args が無視されるバグ (GH 55009)

  • DataFrame.from_dict() が、作成された DataFrame の行を常にソートするバグ。 (GH 55683)

  • DataFrame.sort_index()axis="columns"ignore_index=True を渡すときに ValueError を発生させるバグ (GH 56478)

  • use_inf_as_na オプションが有効な場合に、DataFrame 内の inf 値のレンダリングに関するバグ (GH 55483)

  • Series をレンダリングする際に、MultiIndex のインデックスレベルのいずれかの名前が 0 であり、その名前が表示されないバグ (GH 55415)

  • 空の DataFrame を列に割り当てる際のエラーメッセージに関するバグ (GH 55956)

  • 時間のような文字列が pyarrow.time64 型の ArrowDtype にキャストされる際のバグ (GH 56463)

  • core.window.Rolling.applyengine="numba" を使用して numpy ufunc を渡すときに numba >= 0.58.0 からの誤った非推奨警告を修正 (GH 55247)

貢献者#

このリリースには合計162人がパッチを貢献しました。「+」が付いている人は初めてパッチを貢献しました。

  • AG

  • Aaron Rahman +

  • Abdullah Ihsan Secer +

  • Abhijit Deo +

  • Adrian D’Alessandro

  • Ahmad Mustafa Anis +

  • Amanda Bizzinotto

  • Amith KK +

  • Aniket Patil +

  • Antonio Fonseca +

  • Artur Barseghyan

  • Ben Greiner

  • Bill Blum +

  • Boyd Kane

  • Damian Kula

  • Dan King +

  • Daniel Weindl +

  • Daniele Nicolodi

  • David Poznik

  • David Toneian +

  • Dea María Léon

  • Deepak George +

  • Dmitriy +

  • Dominique Garmier +

  • Donald Thevalingam +

  • Doug Davis +

  • Dukastlik +

  • Elahe Sharifi +

  • Eric Han +

  • ファンチェン・リー

  • Francisco Alfaro +

  • Gadea Autric +

  • Guillaume Lemaitre

  • Hadi Abdi Khojasteh

  • Hedeer El Showk +

  • Huanghz2001 +

  • アイザック・ヴィルシュプ

  • Issam +

  • Itay Azolay +

  • Itayazolay +

  • Jaca +

  • Jack McIvor +

  • JackCollins91 +

  • James Spencer +

  • Jay

  • Jessica Greene

  • Jirka Borovec +

  • JohannaTrost +

  • John C +

  • Joris Van den Bossche

  • José Lucas Mayer +

  • José Lucas Silva Mayer +

  • João Andrade +

  • Kai Mühlbauer

  • Katharina Tielking, MD +

  • Kazuto Haruguchi +

  • Kevin

  • Lawrence Mitchell

  • Linus +

  • Linus Sommer +

  • Louis-Émile Robitaille +

  • Luke Manley

  • Lumberbot (aka Jack)

  • Maggie Liu +

  • MainHanzo +

  • Marc Garcia

  • Marco Edward Gorelli

  • MarcoGorelli

  • Martin Šícho +

  • Mateusz Sokół

  • Matheus Felipe +

  • Matthew Roeschke

  • Matthias Bussonnier

  • Maxwell Bileschi +

  • Michael Tiemann

  • Michał Górny

  • Molly Bowers +

  • Moritz Schubert +

  • NNLNR +

  • Natalia Mokeeva

  • Nils Müller-Wendt +

  • Omar Elbaz

  • Pandas Development Team

  • Paras Gupta +

  • Parthi

  • Patrick Hoefler

  • Paul Pellissier +

  • Paul Uhlenbruck +

  • Philip Meier

  • Philippe THOMY +

  • Quang Nguyễn

  • Raghav

  • Rajat Subhra Mukherjee

  • Ralf Gommers

  • Randolf Scholz +

  • Richard Shadrach

  • Rob +

  • Rohan Jain +

  • Ryan Gibson +

  • Sai-Suraj-27 +

  • Samuel Oranyeli +

  • Sara Bonati +

  • Sebastian Berg

  • Sergey Zakharov +

  • Shyamala Venkatakrishnan +

  • StEmGeo +

  • ステファニー・モリン

  • Stijn de Gooijer +

  • Thiago Gariani +

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

  • Thomas Baumann +

  • Thomas Guillet +

  • Thomas Lazarus +

  • Thomas Li

  • Tim Hoffmann

  • Tim Swast

  • Tom Augspurger

  • Toro +

  • トルステン・ヴェルトワイン

  • Ville Aikas +

  • Vinita Parasrampuria +

  • Vyas Ramasubramani +

  • ウィリアム・アンドレア

  • ウィリアム・エイド

  • Willian Wang +

  • Xiao Yuan

  • Yao Xiao

  • Yves Delley

  • Zemux1613 +

  • Ziad Kermadi +

  • aaron-robeson-8451 +

  • aram-cinnamon +

  • caneff +

  • ccccjone +

  • chris-caballero +

  • cobalt

  • color455nm +

  • denisrei +

  • dependabot[bot]

  • jbrockmendel

  • jfadia +

  • johanna.trost +

  • kgmuzungu +

  • mecopur +

  • mhb143 +

  • morotti +

  • mvirts +

  • omar-elbaz

  • paulreece

  • pre-commit-ci[bot]

  • raj-thapa

  • レベッカ-パーマー

  • rmhowe425

  • rohanjain101

  • shiersansi +

  • smij720

  • srkds +

  • taytzehao

  • torext

  • vboxuser +

  • xzmeng +

  • yashb +