在計算機程式設計中，pandas 是用於資料操縱和分析的 Python 軟體庫。它建造在 NumPy 基礎上，併為操縱數值表格和時間序列，提供了資料結構和運算操作。它是在三條款 BSD 許可證下發行的自由軟體。它的名字衍生自術語 面板資料（panel data），這是計量經濟學的術語，即包括了對同一個體在多個時期內的觀測的資料集。它的名字還可解釋為對短語 Python data analysis 的玩笑。 歷史 2008 年，原作者開始在 AQR 資本管理公司製作 pandas，用來滿足在財務資料上進行時，對高效能、靈活工具的需要。2009 年，他在離開 AQR 之前，說服管理者允許他將這個軟體庫開放原始碼。下面是其開發過程的時間線： 2008 年，pandas 開發開始。 2009 年，pandas 開源。 2012 年，另一個 AQR 僱員 Chang She 加入了這個專案，併成為這個軟體庫的第二個主要貢獻者。第一版《Python for Data Analysis》發布。 2015 年，pandas 簽約為 NumFOCUS 的一個財務贊助專案，NumFOCUS 是美國的 501 c3 非營利公益組織。 2018 年，舉行了第一次面對面的 核心開發者衝刺。 2022 年，第三版《Python for Data Analysis》公開版線上發行。 資料模型 pandas 的序列（Series）是一維的加標籤資料結構，它能夠持有任何資料型別，如整數、字串、浮點數和 Python 物件等，軸標籤在集體上稱為索引（index）。序列表現得非常類似於 NumPy 的 ndarray 資料結構，並且是大多數 NumPy 函式的有效實際引數。 pandas 提供了類似於 R 語言中 dataframe 物件的資料幀（DataFrame），它是二維的加標籤資料結構，其諸縱列潛在的可能具有不同的型別；資料幀就像是電子表格或 SQL 表，或者是序列物件的字典，這種格局也叫做（SoA）。pandas 允許各種資料操縱運算操作，比如選擇、歸併和重製形狀，還有資料清洗和特徵。 主要特徵 pandas 提供了快速而高效的資料幀物件，用於憑藉其整合的索引進行資料操縱。它的主要特徵有： 易於將在其他的 Python 和 NumPy 資料結構中，參差不齊或不同索引的資料，轉換成資料幀物件。 大小可變性，可以在資料幀和更高維物件中插入或刪除縱列。 自動和顯式的 資料對齊，標籤和資料之間的聯絡是固有的，但是可以顯式的控制二元運算的匹配和廣播行為。兩個序列物件按標籤自動對齊，兩個資料幀物件自動對齊於縱列標籤和索引（即橫行標籤）二者上，二元運算的結果物件具有雙方的縱列標籤和橫行標籤的並集；資料幀與序列物件之間的預設行為，是序列的索引自動對齊於資料幀的縱列標籤，從而逐橫行廣播。 易於處理缺失資料，它被表示為用於浮點數的 NaN（即 NumPy 的 nan）、用於日期時間的 NaT 或跨資料型別的 NA。 智慧的對大資料集的基於標籤的，多重索引和其他花樣索引，依據布林值向量的。 直觀的資料集的歸併和連線。 強大而靈活的（groupby）功能，用來在資料集上進行分離 應用 合併（splitapplycombine）運算，它可用於資料和二者。 靈活的資料集的重製形狀（reshape）和樞軸彙總。 軸可以有層級標籤，從而在繪圖時每個刻度可能有多重標籤。 健壯的 IO 工具，用於從 CSV 和其他平面檔案、JSON、、SQL 表和查詢、Excel 檔案裝載資料，並以極快的 HDF5 格式儲存 裝載資料。 特定於時間序列的功能，例如日期範圍生成和頻率轉換，移動視窗統計，日期和。 pandas 經過了高度的效能最佳化，關鍵程式碼路徑用 Cython 或 C 語言寫成。pandas 可以利用 PyArrow 來擴充套件功能並增進各種 API 的效能。pandas 的預設繪圖後端是 matplotlib，還可以擴充套件上其他第三方後端，比如 Plotly Express。 SQL OLAP 列式資料庫 DuckDB，可以在 pandas 資料幀上執行 SQL。 示例 在下面的梗概示例中，展示針對資料幀的縱列和橫行的基本運算： import pandas as pd import numpy as np import matplotlibpyplot as plt data variable A 3 B 3 C 3 D 3 date pdto_datetime 20230101 20230102 20230103 4 value x 01 for x in range 12 df pdDataFrame data type df value pdSeries True df value1 df value 01 df variable date value value1 0 A 20230101 01 02 1 A 20230102 11 12 2 A 20230103 21 22 3 B 20230101 31 32 4 B 20230102 41 42 5 B 20230103 51 52 6 C 20230101 61 62 7 C 20230102 71 72 8 C 20230103 81 82 9 D 20230101 91 92 10 D 20230102 101 102 11 D 20230103 111 112 dfindex RangeIndex start0 stop12 step1 dfcolumns Index variable date value value1 dtypeobject dfloc 1 2 value value1 value value1 1 11 12 2 21 22 dfcolumnsget_loc x for x in value value1 2 3 dfiloc 1 2 2 3 value value1 1 11 12 2 21 22 df df value2 1 df value1 3 variable date value value1 2 A 20230103 21 22 dfquery value2 1 value1 3 variable date value value1 2 A 20230103 21 22 資料幀中的資料經常儲存為兩種格式：堆疊格式或記錄格式。在堆疊格式中，針對每個主題（subject）在適用情況下有多個橫行，故而也稱為 長 格式。在記錄格式中，針對每個主題典型地有一個橫行，故而也稱為 寬 格式。在這個例子中，如果要對每個唯一的變數（A B C D）進行時間序列運算，更好的表示形式為：諸縱列都對應唯一的變數（即對應不同的觀測地點或觀測者），而日期索引（date）標識出每個（不可細分的）個體觀測。為此使用 pivot ，將資料幀從堆疊格式重製形狀為記錄格式： dfdrop 0 4 8pivot indexdate columnsvariable value value1 variable A B C D A B C D date 20230101 NaN 31 61 91 NaN 32 62 92 20230102 11 NaN 71 101 12 NaN 72 102 20230103 21 51 NaN 111 22 52 NaN 112 這裡給 pivot 的輸入資料幀的諸縱列中，除了指定用作 index 和 columns 的縱列（date 和 variable），仍有多個值縱列（value value1）；這裡沒有透過指定 values 引數來選取其中之一，故而結果資料幀的諸縱列被納入層級式索引（即多重索引 MultiIndex），其最頂層指示出各自的值縱列（即依據觀測量的不同而進行頂層分組）。 使用 concat 和 merge ，對資料幀進行和歸併運算： df1 dfdrop columnsvaluerename columnsvalue1 value df1 pdconcat dfdrop columnsvalue1 df1 ignore_indexTrue df1shape 24 3 data1 A pdTimestamp 20230101 03 A pdTimestamp 20230102 13 rows pdDataFrame data1 columnsvariable date value pdconcat df1 rows ignore_indexTruetail 3 variable date value 23 D 20230103 112 24 A 20230101 03 25 A 20230102 13 right pdDataFrame data1 01 columnsvariable date value1 pdmerge df1 right onvariable date howinner variable date value value1 0 A 20230101 01 03 1 A 20230101 02 03 使用 groupby 和 agg ，對資料幀進行和運算： df2 df1groupby date variableagg value sum df2 value date variable 20230101 A 03 B 63 C 123 D 183 20230102 A 23 B 83 C 143 D 203 20230103 A 43 B 103 C 163 D 223 df2shape 12 1 df2index MultiIndex 20230101 A 20230101 B 20230101 C 20230101 D 20230102 A 20230102 B 20230102 C 20230102 D 20230103 A 20230103 B 20230103 C 20230103 D namesdate variable df2columns Index value dtypeobject df2loc 20230102 A value 23 Name 20230102 000000 A dtype float64 df2loc 20230102 value variable A 23 B 83 C 143 D 203 df2xs A levelvariable value date 20230101 03 20230102 23 20230103 43 使用 pivot_table ，對資料幀進行樞軸彙總運算： df3 df1pivot_table indexdate columnsvariable aggfuncsum df3 value variable A B C D date 20230101 03 63 123 183 20230102 23 83 143 203 20230103 43 103 163 223 df3shape 3 4 df3to_numpy array 03 63 123 183 23 83 143 203 43 103 163 223 df3index DatetimeIndex 20230101 20230102 20230103 dtypedatetime64 ns namedate freqNone df3columns MultiIndex value A value B value C value D namesNone variable df1pivot_table indexdate columnsvariable valuesvalue aggfuncsumcolumns Index A B C D dtypeobject namevariable df3 valuecolumns Index A B C D dtypeobject namevariable df3 value A date 20230101 03 20230102 23 20230103 43 Name value A dtype float64 用 matplotlib 為資料幀繪製條形圖： ax df3plotbar h l axget_legend_handles_labels axlegend h df3columnsget_level_values 1 titleNone locupper left matplotliblegendLegend object at 0x7fdd1cff96d0 axset_xticklabels xstrftime Y m d for x in df3index rotation0 Text 0 0 20230101 Text 1 0 20230102 Text 2 0 20230103 axget_xaxis get_label set_visible False axgrid axisy linestyle axset_axisbelow True for i m in enumerate axcontainers for j n in enumerate mget_children nset_x j 0805 idf3columnssize nset_width 08df3columnssize axbar_label m fontsizesmall Text 0 0 03 Text 0 0 23 Text 0 0 43 Text 0 0 63 Text 0 0 83 Text 0 0 103 Text 0 0 123 Text 0 0 143 Text 0 0 163 Text 0 0 183 Text 0 0 203 Text 0 0 223 pltshow 匯出和匯入 CSV 檔案： df3to_csv dftestcsv float_format1f df4 pdread_csv dftestcsv header0 1 index_col0 df4shape 3 4 這裡的標頭（header）指定用作縱列名字的橫行，而索引列（index_col）指定用作索引（index）即橫行標籤的縱列。 使用 utillinux 工具組成員 column 來檢視匯出的 CSV 檔案： cat dftestcsv column s o t valuevaluevaluevalue variable A B C D date 2023010103 63 123 183 2023010223 83 143 203 2023010343 103 163 223 匯出和匯入 JSON 檔案： df3to_json dftestjson orientindex date_formatiso date_units df4 pdread_json dftestjson orientindex df4shape 3 4 df4columns Index value A value B value C value D dtypeobject df4columns pdMultiIndexfrom_tuples eval x for x in df4columns df4indexname df3indexname df4columnsname df3columnsname 這裡指定了方向（orient）為索引（index），即採用次序；這裡指定了日期時間格式為 ISO 8601 標準格式，並且時間單位為秒。 使用 jq 語言實現 jq 來檢視匯出的 JSON 檔案： cat dftestjson jq 20230101T000000 value A 03 value B 63 value C 123 value D 183 20230102T000000 value A 23 value B 83 value C 143 value D 203 20230103T000000 value A 43 value B 103 value C 163 value D 223 匯出和匯入 HDF5 檔案基於了 PyTables： df3to_hdf dftesth5 keydf3 modew df4 pdread_hdf dftesth5 keydf3 df4shape 3 4 這裡透過鍵（key）引數，指定了與資料幀相對應的在 HDF5 檔案中的群組（Group），對它採用了預設的固定（fixed）儲存格式，而檔案開啟模態 w 是為 寫（write）即 新建。 使用 hdf5tools 工具組成員 h5ls 來檢視匯出的 HDF5 檔案： h5ls r d dftesth5 Group df3 Group df3axis0_label0 Dataset 4 Data 0 0 0 0 df3axis0_label1 Dataset 4 Data 0 1 2 3 df3axis0_level0 Dataset 1 Data value df3axis0_level1 Dataset 4 Data A B C D df3axis1 Dataset 3 Data 1672531200000000000 1672617600000000000 1672704000000000000 df3block0_items_label0 Dataset 4 Data 0 0 0 0 df3block0_items_label1 Dataset 4 Data 0 1 2 3 df3block0_items_level0 Dataset 1 Data value df3block0_items_level1 Dataset 4 Data A B C D df3block0_values Dataset 3 4 Data 03 63 123 183 23 83 143 203 43 103 163 223 這裡的 HDF5 檔案中的日期時間表示，是以納秒為單位的 UNIX 時間時間戳。這種儲存格式儲存了資料幀的兩個軸和所有的塊。由於這裡只有一個塊，這個塊的 items 的內容同於 axis0，而匯出前面的資料幀 df 之時，它的四個縱列會整合（consolidate）為三個塊，其 items 的並集同於 axis0。 儲存 HDF5 檔案還可採用表格（table）格式，HDF5 檔案中這種儲存格式的群組，可以直接在其上進行查詢和刪除： df3to_hdf dftesth5 keydf4 formattable modea pdread_hdf dftesth5 keydf4 whereindex 20230101 columnsvalue A value C value variable A C date 20230102 23 143 20230103 43 163 這裡的檔案開啟模態 a 是為 附加（append）。 檢視變更後的 HDF5 檔案： h5ls dftesth5 df3 Group df4 Group h5ls r dftesth5df4 _i_table Group _i_tableindex Group _i_tableindexabounds Dataset 0Inf _i_tableindexbounds Dataset 0Inf 127 _i_tableindexindices Dataset 0Inf 131072 _i_tableindexindicesLR Dataset 131072 _i_tableindexmbounds Dataset 0Inf _i_tableindexmranges Dataset 0Inf _i_tableindexranges Dataset 0Inf 2 _i_tableindexsorted Dataset 0Inf 131072 _i_tableindexsortedLR Dataset 131201 _i_tableindexzbounds Dataset 0Inf table Dataset 3Inf h5ls d dftesth5df4table table Dataset 3Inf Data 1672531200000000000 0363123183 1672617600000000000 2383143203 1672704000000000000 43103163223 這裡的_i_tableindex 群組儲存了 PyTables 的 tablesindex 模組所存取的內容。 匯出和匯入 netCDF 檔案可以藉助 xarray，它依賴於 pandas，它透過 netcdf4python 支援匯入匯出 netCDF4 格式資料，透過 SciPy 支援其他版本 netCDF 格式。xarray 能夠在自身的資料陣列（DataArray）與 pandas 的序列之間，在自身的資料集（Dataset）與 pandas 的資料幀之間，進行相互轉換： df3stack shape 12 1 import xarray as xr df3stack to_xarray to_netcdf dftestnc df4 xropen_dataset dftestncto_dataframe unstack df4shape 3 4 使用 netcdfbin 工具組成員 ncdump 來檢視匯出的 netCDF 檔案： ncdump dftestnc netcdf dftest dimensions date 3 variable 4 variables int64 date date dateunits days since 20230101 000000 datecalendar proleptic_gregorian string variable variable double value date variable value_FillValue NaN data date 0 1 2 variable A B C D value 03 63 123 183 23 83 143 203 43 103 163 223 ncdump k dftestnc netCDF4 h5ls r d dftestnc Group date Dataset 3 Data 0 1 2 value Dataset 3 4 Data 03 63 123 183 23 83 143 203 43 103 163 223 variable Dataset 4 Data A B C D xarray 的日期時間表示遵循了，這裡的時間單位為距離某個指定的開始日期時間的日數，曆法為前推格里高利曆。ncdump 的輸出採用了 netCDF 的 公用資料語言（CDL），它所稱謂的變數，代表相同型別的值的多維陣列，變數宣告指定了變數的資料型別、名字和以維度名字列表描述的形狀。這裡有三個變數：value 是資料變數，date 和 variable 是座標變數，而變數宣告 double value date variable 中，轉換得來的維度名字同於座標變數名字。 參見 NumPy R 語言 Scikitlearn 數值分析軟體 引用 延伸閱讀 外部連結 Category 自由統計軟體 CategoryPython 科學庫 Category 使用 BSD 許可證的軟體 Category 開源軟體 CategoryPython 軟體 CategoryPython 庫