2.3.0 版本有什麼新功能 (2025 年 6 月 4 日)#
這是 pandas 2.3.0 中的更改。有關包含其他 pandas 版本的完整更改日誌,請參閱 發行說明。
pandas 3.0 中的即將發生的更改#
pandas 3.0 將為 pandas 的預設行為帶來兩項重大更改。
預設情況下專用的字串資料型別#
歷史上,pandas 使用 NumPy 的 object 資料型別來表示字串列。這種表示方法存在許多問題:它不專門針對字串(object 型別的陣列可以儲存任何 Python 物件,而不僅僅是字串),而且通常效率不高(在效能和記憶體使用方面)。
從即將釋出的 pandas 3.0 版本開始,將預設啟用專用的字串資料型別(如果安裝了 PyArrow,則由其支援,否則回退到 NumPy)。這意味著在建立 pandas 物件(例如建構函式或 IO 函式)時,pandas 將開始將包含字串資料的列推斷為新的 str 資料型別。
舊行為
>>> ser = pd.Series(["a", "b"])
0 a
1 b
dtype: object
新行為
>>> ser = pd.Series(["a", "b"])
0 a
1 b
dtype: str
在這些場景中使用的字串資料型別在很大程度上將表現得像 NumPy object 一樣,包括缺失值語義和這些列上的通用操作。
但是,新預設 dtype 的引入也將對您的程式碼產生一些破壞性影響(例如,當檢查 .dtype 是否為 object dtype 時)。為了在 pandas 3.0 版本釋出前進行測試,可以在 pandas 2.3 中啟用此未來 dtype 推斷邏輯:
pd.options.future.infer_string = True
有關行為更改以及如何使您的程式碼適應新預設值的更多詳細資訊,請參閱 新字串資料型別遷移指南 (pandas 3.0)。
寫時複製#
目前可選的寫時複製模式將在 pandas 3.0 中預設啟用。將沒有保留舊行為的選項。
總之,新的“寫時複製”行為將在 pandas 關於複製和檢視的操作方式上帶來行為上的改變。
任何索引操作(以任何方式子集化 DataFrame 或 Series,即包括將 DataFrame 列作為 Series 訪問)或返回新的 DataFrame 或 Series 的任何方法的結果,在使用者 API 方面始終表現得像是複製。
因此,如果您想修改一個物件(DataFrame 或 Series),唯一的方法是直接修改該物件本身。
由於每個索引步驟現在都表現為複製,這也意味著“鏈式賦值”(透過多個 setitem 步驟更新 DataFrame)將停止工作。由於這現在始終不起作用,因此將刪除 SettingWithCopyWarning。
新行為語義在 關於寫時複製的使用者指南 中有更詳細的解釋。
自 pandas 2.0 起,可以透過以下選項啟用新行為:
pd.options.mode.copy_on_write = True
一些行為更改允許進行清晰的棄用,例如鏈式賦值的更改。其他更改更為微妙,因此警告被隱藏在一個可以自 pandas 2.2 起啟用的選項後面。
pd.options.mode.copy_on_write = "warn"
此模式將在許多與大多數查詢無關的場景中發出警告。我們建議探索此模式,但無需消除所有這些警告。 遷移指南 詳細解釋了升級過程。
增強功能#
其他增強功能#
pandas.api.interchange.from_dataframe()現在使用 PyCapsule 介面(如果可用),僅在失敗時才回退到 Dataframe Interchange Protocol(GH 60739)。對
__array__方法中的copy關鍵字(即在使用 pandas 物件的np.array()或np.asarray()時呼叫)的語義已更新,以便與 NumPy >= 2 一起正確工作(GH 57739)。當
future.infer_string為 True 時,Series.str.decode()的結果現在具有StringDtype(GH 60709)。to_hdf()和to_hdf()現在可以與StringDtype進行往返(GH 60663)。改進了
NumpyExtensionArray的repr,以考慮 NEP51(GH 61085)。Series.str.decode()已獲得dtype引數,用於控制結果的 dtype(GH 60940)。現在為
StringDtype列實現了cumsum()、cummin()和cummax()規約(GH 60633)。現在為
StringDtype列實現了sum()規約(GH 59853)。
棄用#
棄用了
str.contains()、str.startswith()和str.endswith()中na引數允許非bool值的情況,對於那些尚未不允許這些值的 dtypes(GH 59615)。棄用了
StringDtype的"pyarrow_numpy"儲存選項(GH 60152)。
Bug 修復#
數值#
在
Series.mode()和DataFrame.mode()中,當dropna=False時,存在一個錯誤,即在存在NA值的情況下,並非所有 dtypes 都會排序(GH 60702)。在
Series.round()中存在一個錯誤,即使用objectdtype 時總是會引發TypeError(GH 61206)。
字串#
在
Series.__pos__()和DataFrame.__pos__()中存在一個錯誤,即對於storage="pyarrow"的StringDtype,未能引發Exception(GH 60710)。在
storage="pyarrow"的StringDtype的Series.rank()中存在一個錯誤,它錯誤地返回了帶有method="average"的整數結果,並在截斷結果時引發錯誤(GH 59768)。在
Series.replace()中,當使用非字串值替換StringDtype時,未向上轉換為objectdtype,存在一個錯誤(GH 60282)。在
storage="pyarrow"的StringDtype的Series.str.center()中,當填充字元數為奇數時的邊緣情況,未能與 Python 行為匹配,存在一個錯誤(GH 54792)。在
storage="pyarrow"的StringDtype的Series.str.replace()中,當n < 0時,存在一個錯誤(GH 59628)。在
ArrowDtype和storage="pyarrow"的StringDtype的Series.str.slice()中,當使用負數step時,返回了錯誤的結果,存在一個錯誤(GH 59710)。
索引#
當啟用
infer_string時,在Index.get_indexer()透過字串 dtype 進行往返時存在一個錯誤(GH 55834)。
I/O#
在
DataFrame.to_excel()中存在一個錯誤,它將十進位制數儲存為字串而不是數字(GH 49598)。
其他#
當可選依賴項
pyarrow或jinja2未安裝時,修復了inspect的使用(GH 60196)。
貢獻者#
共有 24 人為此次釋出貢獻了補丁。名字旁邊帶有“+”的人是首次貢獻補丁。
ChiLin Chiu +
Irv Lustig
Isuru Fernando +
Jake Thomas Trevallion +
Joris Van den Bossche
Kevin Amparado +
LOCHAN PAUDEL +
Lumberbot (aka Jack)
Marc Mueller +
Marco Edward Gorelli
Matthew Roeschke
Pandas Development Team
Patrick Hoefler
Richard Shadrach
SALCAN +
Sebastian Berg
Simon Hawkins
Thomas Li
Will Ayd
William Andrea
William Ayd
dependabot[bot]
jbrockmendel
tasfia8 +