pandas
原作者 | Wes McKinney |
---|---|
開發者 | 社群 |
首次發布 | 2008年1月11日 |
目前版本 | 2.2.3[1](2024年9月20日,24天前) |
原始碼庫 | |
程式語言 | Python, Cython, C |
作業系統 | 跨平台 |
類型 | 資料分析 |
許可協定 | 三條款BSD許可證 |
網站 | pandas |
在電腦編程中,pandas是用於資料操縱和分析的Python軟體庫。它建造在NumPy基礎上,並為操縱數值表格和時間序列,提供了資料結構和運算操作。它是在三條款BSD許可證下發行的自由軟體[2]。它的名字衍生自術語「縱橫資料」(panel data),這是計量經濟學的術語,即包括了對同一個體在多個時期內的觀測的資料集[3]。它的名字還可解釋為對短語「Python data analysis」的玩笑[4]。
歷史
[編輯]2008年,原作者Wes McKinney開始在AQR資本管理公司製作pandas,用來滿足在財務資料上進行定量分析時,對高效能、靈活工具的需要。2009年,他在離開AQR之前,說服管理者允許他將這個軟體庫開放原始碼。下面是其開發過程的時間線[5]:
- 2008年,pandas開發開始。
- 2009年,pandas開源。
- 2012年,另一個AQR雇員Chang She加入了這個專案,並成為這個軟體庫的第二個主要貢獻者。第一版《Python for Data Analysis》發布。
- 2015年,pandas簽約為NumFOCUS的一個財務贊助專案,NumFOCUS是美國的501(c)(3)非營利公益組織。
- 2018年,舉行了第一次面對面的「核心開發者衝刺」。
- 2022年,第三版《Python for Data Analysis》公開版線上發行[6]。
資料模型
[編輯]pandas的序列(Series
)是一維的加標籤資料結構,它能夠持有任何資料類型,如整數、字串、浮點數和Python對象等,軸標籤在集體上稱為索引(index
)。序列表現得非常類似於NumPy的ndarray
資料結構,並且是大多數NumPy函式的有效實際參數。
pandas提供了類似於R語言中data.frame
對象的資料訊框(DataFrame
),它是二維的加標籤資料結構,其諸縱列潛在的可能具有不同的類型;資料訊框就像是電子試算表或SQL表,或者是序列對象的字典[7],這種格局也叫做陣列之結構(SoA)。pandas允許各種資料操縱運算操作,比如選擇[8]、合併[9]和重製形狀[10],還有資料淨化和資料加工特徵。
主要特徵
[編輯]pandas提供了快速而高效的資料訊框對象,用於憑藉其整合的索引進行資料操縱。它的主要特徵有:
- 易於將在其他的Python和NumPy資料結構中,參差不齊或不同索引的資料,轉換成資料訊框對象。
- 大小可變性,可以在資料訊框和更高維對象中插入或刪除縱列。
- 自動和顯式的「資料對齊」,標籤和資料之間的聯絡是原生的,但是可以顯式的控制二元運算的匹配和廣播行為[11]。兩個序列對象按標籤自動對齊,兩個資料訊框對象自動對齊於縱列標籤和索引(即橫行標籤)二者上,二元運算的結果對象具有雙方的縱列標籤和橫行標籤的併集;資料訊框與序列對象之間的預設行為,是序列的索引自動對齊於資料訊框的縱列標籤,從而逐橫行廣播[12]。
- 易於處理缺失資料,它被表示為用於浮點數的
NaN
(即NumPy的nan
)、用於日期時間的NaT
或跨資料類型的NA
[13]。 - 智慧型的對巨量資料集的基於標籤的分片,多重索引和其他花樣索引,依據布林值向量的子集化。
- 直觀的資料集的合併和連接。
- 強大而靈活的分組(
groupby
)功能,用來在資料集上進行分離-應用-合併(split-apply-combine)運算,它可用於資料聚合和變換二者。 - 靈活的資料集的重製形狀(reshape)和樞軸匯總。
- 軸可以有層級標籤,從而在繪圖時每個刻度可能有多重標籤。
- 健壯的I/O工具,用於從CSV和其他平面檔案、JSON、Parquet、SQL表和查詢、Excel檔案裝載資料,並以極快的HDF5格式儲存/裝載資料。[14]
- 特定於時間序列的功能,例如日期範圍生成和頻率轉換,移動窗口統計,日期移位和滯後。
pandas經過了高度的效能最佳化,關鍵代碼路徑用Cython或C語言寫成。pandas可以利用PyArrow來擴充功能並增進各種API的效能[15]。pandas的預設繪圖後端是matplotlib,還可以擴充上其他第三方繪圖後端[16],比如Plotly Express[17]。 行程內SQL OLAP列式資料庫DuckDB,可以在pandas資料訊框上執行SQL[18]。
範例
[編輯]在下面的梗概範例中,展示針對資料訊框的縱列和橫行的基本運算:
>>> import pandas as pd
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>>
>>> data = {
... 'variable': ['A'] * 3 + ['B'] * 3 + ['C'] * 3 + ['D'] * 3,
... 'date': pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03'] * 4),
... 'value': [x + 0.1 for x in range(12)]
... }
>>>
>>> df = pd.DataFrame(data)
>>> type(df['value']) == pd.Series
True
>>>
>>> df['value1'] = df['value'] + 0.1
>>> df
variable date value value1
0 A 2023-01-01 0.1 0.2
1 A 2023-01-02 1.1 1.2
2 A 2023-01-03 2.1 2.2
3 B 2023-01-01 3.1 3.2
4 B 2023-01-02 4.1 4.2
5 B 2023-01-03 5.1 5.2
6 C 2023-01-01 6.1 6.2
7 C 2023-01-02 7.1 7.2
8 C 2023-01-03 8.1 8.2
9 D 2023-01-01 9.1 9.2
10 D 2023-01-02 10.1 10.2
11 D 2023-01-03 11.1 11.2
>>>
>>> df.index
RangeIndex(start=0, stop=12, step=1)
>>>
>>> df.columns
Index(['variable', 'date', 'value', 'value1'], dtype='object')
>>>
>>> df.loc[[1, 2], ['value', 'value1']]
value value1
1 1.1 1.2
2 2.1 2.2
>>>
>>> [df.columns.get_loc(x) for x in ['value', 'value1']]
[2, 3]
>>>
>>> df.iloc[[1, 2], [2, 3]]
value value1
1 1.1 1.2
2 2.1 2.2
>>>
>>> df[(df['value']/2 > 1) & (df['value1'] < 3)]
variable date value value1
2 A 2023-01-03 2.1 2.2
>>>
>>> df.query('value/2 > 1 & value1 < 3')
variable date value value1
2 A 2023-01-03 2.1 2.2
>>>
資料訊框中的資料經常儲存為兩種格式:堆疊格式或記錄格式。在堆疊格式中,針對每個主題(subject)在適用情況下有多個橫行,故而也稱為「長」格式。在記錄格式中,針對每個主題典型地有一個橫行,故而也稱為「寬」格式。在這個例子中,如果要對每個唯一的變數('A', 'B', 'C', 'D'
)進行時間序列運算,更好的表示形式為:諸縱列都對應唯一的變數(即對應不同的觀測地點或觀測者),而日期索引('date'
)標識出每個(不可細分的)個體觀測。為此使用pivot()
,將資料訊框從堆疊格式重製形狀為記錄格式:
>>> df.drop([0, 4, 8]).pivot(index='date', columns='variable')
value value1
variable A B C D A B C D
date
2023-01-01 NaN 3.1 6.1 9.1 NaN 3.2 6.2 9.2
2023-01-02 1.1 NaN 7.1 10.1 1.2 NaN 7.2 10.2
2023-01-03 2.1 5.1 NaN 11.1 2.2 5.2 NaN 11.2
>>>
這裡給pivot()
的輸入資料訊框的諸縱列中,除了指定用作index
和columns
的縱列('date'
和'variable'
),仍有多個值縱列('value', 'value1'
);這裡沒有通過指定values
參數來選取其中之一,故而結果資料訊框的諸縱列被納入層級式索引(即多重索引MultiIndex
),其最頂層指示出各自的值縱列(即依據觀測量的不同而進行頂層分組)。
使用concat()
和merge()
,對資料訊框進行串接和合併運算:
>>> df1 = df.drop(columns='value').rename(columns={'value1': 'value'})
>>> df1 = pd.concat([df.drop(columns='value1'), df1], ignore_index=True)
>>> df1.shape
(24, 3)
>>>
>>> data1 = [
... ('A', pd.Timestamp('2023-01-01'), 0.3),
... ('A', pd.Timestamp('2023-01-02'), 1.3)
... ]
>>>
>>> rows = pd.DataFrame(data1, columns=['variable', 'date', 'value'])
>>> pd.concat([df1, rows], ignore_index=True).tail(3)
variable date value
23 D 2023-01-03 11.2
24 A 2023-01-01 0.3
25 A 2023-01-02 1.3
>>>
>>> right = pd.DataFrame(data1[0:1], columns=['variable', 'date', 'value1'])
>>> pd.merge(df1, right, on=['variable', 'date'], how='inner')
variable date value value1
0 A 2023-01-01 0.1 0.3
1 A 2023-01-01 0.2 0.3
>>>
使用groupby()
和agg()
,對資料訊框進行分組和聚合運算:
>>> df2 = df1.groupby(['date', 'variable']).agg({'value': 'sum'})
>>> df2
value
date variable
2023-01-01 A 0.3
B 6.3
C 12.3
D 18.3
2023-01-02 A 2.3
B 8.3
C 14.3
D 20.3
2023-01-03 A 4.3
B 10.3
C 16.3
D 22.3
>>>
>>> df2.shape
(12, 1)
>>>
>>> df2.index
MultiIndex([('2023-01-01', 'A'),
('2023-01-01', 'B'),
('2023-01-01', 'C'),
('2023-01-01', 'D'),
('2023-01-02', 'A'),
('2023-01-02', 'B'),
('2023-01-02', 'C'),
('2023-01-02', 'D'),
('2023-01-03', 'A'),
('2023-01-03', 'B'),
('2023-01-03', 'C'),
('2023-01-03', 'D')],
names=['date', 'variable'])
>>>
>>> df2.columns
Index(['value'], dtype='object')
>>>
>>> df2.loc[('2023-01-02', 'A')]
value 2.3
Name: (2023-01-02 00:00:00, A), dtype: float64
>>>
>>> df2.loc['2023-01-02']
value
variable
A 2.3
B 8.3
C 14.3
D 20.3
>>>
>>> df2.xs('A', level='variable')
value
date
2023-01-01 0.3
2023-01-02 2.3
2023-01-03 4.3
>>>
使用pivot_table()
,對資料訊框進行樞軸匯總運算:
>>> df3 = df1.pivot_table(index='date', columns='variable', aggfunc='sum')
>>> df3
value
variable A B C D
date
2023-01-01 0.3 6.3 12.3 18.3
2023-01-02 2.3 8.3 14.3 20.3
2023-01-03 4.3 10.3 16.3 22.3
>>>
>>> df3.shape
(3, 4)
>>>
>>> df3.to_numpy()
array([[ 0.3, 6.3, 12.3, 18.3],
[ 2.3, 8.3, 14.3, 20.3],
[ 4.3, 10.3, 16.3, 22.3]])
>>>
>>> df3.index
DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'], dtype='datetime64[ns]', name='date', freq=None)
>>>
>>> df3.columns
MultiIndex([('value', 'A'),
('value', 'B'),
('value', 'C'),
('value', 'D')],
names=[None, 'variable'])
>>>
>>> df1.pivot_table(index='date', columns='variable', values='value', aggfunc='sum').columns
Index(['A', 'B', 'C', 'D'], dtype='object', name='variable')
>>>
>>> df3['value'].columns
Index(['A', 'B', 'C', 'D'], dtype='object', name='variable')
>>>
>>> df3[('value', 'A')]
date
2023-01-01 0.3
2023-01-02 2.3
2023-01-03 4.3
Name: (value, A), dtype: float64
>>>
用matplotlib為資料訊框繪製條形圖:
>>> ax = df3.plot.bar()
>>> h, l = ax.get_legend_handles_labels()
>>> ax.legend(h, df3.columns.get_level_values(1), title=None, loc='upper left')
<matplotlib.legend.Legend object at 0x7fdd1cff96d0>
>>> ax.set_xticklabels([x.strftime('%Y-%m-%d') for x in df3.index], rotation=0)
[Text(0, 0, '2023-01-01'), Text(1, 0, '2023-01-02'), Text(2, 0, '2023-01-03')]
>>> ax.get_xaxis().get_label().set_visible(False)
>>> ax.grid(axis='y', linestyle=':')
>>> ax.set_axisbelow(True)
>>> for i, m in enumerate(ax.containers):
... for j, n in enumerate(m.get_children()):
... n.set_x(j - 0.8*(0.5 - i/df3.columns.size))
... n.set_width(0.8/df3.columns.size)
... ax.bar_label(m, fontsize='small')
...
[Text(0, 0, '0.3'), Text(0, 0, '2.3'), Text(0, 0, '4.3')]
[Text(0, 0, '6.3'), Text(0, 0, '8.3'), Text(0, 0, '10.3')]
[Text(0, 0, '12.3'), Text(0, 0, '14.3'), Text(0, 0, '16.3')]
[Text(0, 0, '18.3'), Text(0, 0, '20.3'), Text(0, 0, '22.3')]
>>> plt.show()
>>>
匯出和匯入CSV檔案:
>>> df3.to_csv('dftest.csv', float_format='%.1f')
>>>
>>> df4 = pd.read_csv('dftest.csv', header=[0, 1], index_col=0)
>>> df4.shape
(3, 4)
這裡的檔頭(header
)指定用作縱列名字的橫行,而索引列(index_col
)指定用作索引(index
)即橫行標籤的縱列。
使用util-linux工具組成員column
來檢視匯出的CSV檔案:
$ cat dftest.csv | column -s, -o, -t
,value,value,value,value
variable ,A ,B ,C ,D
date , , , ,
2023-01-01,0.3 ,6.3 ,12.3 ,18.3
2023-01-02,2.3 ,8.3 ,14.3 ,20.3
2023-01-03,4.3 ,10.3 ,16.3 ,22.3
匯出和匯入JSON檔案:
>>> df3.to_json('dftest.json', orient='index', date_format='iso', date_unit='s')
>>>
>>> df4 = pd.read_json('dftest.json', orient='index')
>>> df4.shape
(3, 4)
>>>
>>> df4.columns
Index(['('value', 'A')', '('value', 'B')', '('value', 'C')', '('value', 'D')'], dtype='object')
>>>
>>> df4.columns = pd.MultiIndex.from_tuples([eval(x) for x in df4.columns])
>>> df4.index.name = df3.index.name
>>> df4.columns.name = df3.columns.name
這裡指定了方向(orient
)為索引('index'
),即採用橫行為主次序;這裡指定了日期時間格式為ISO 8601標準格式,並且時間單位為秒。
$ cat dftest.json | jq
{
"2023-01-01T00:00:00": {
"('value', 'A')": 0.3,
"('value', 'B')": 6.3,
"('value', 'C')": 12.3,
"('value', 'D')": 18.3
},
"2023-01-02T00:00:00": {
"('value', 'A')": 2.3,
"('value', 'B')": 8.3,
"('value', 'C')": 14.3,
"('value', 'D')": 20.3
},
"2023-01-03T00:00:00": {
"('value', 'A')": 4.3,
"('value', 'B')": 10.3,
"('value', 'C')": 16.3,
"('value', 'D')": 22.3
}
}
>>> df3.to_hdf('dftest.h5', key='df3', mode='w')
>>>
>>> df4 = pd.read_hdf('dftest.h5', key='df3')
>>> df4.shape
(3, 4)
這裡通過鍵(key
)參數,指定了與資料訊框相對應的在HDF5檔案中的群組(Group),對它採用了預設的固定('fixed'
)儲存格式,而檔案打開模態'w'
是為「寫」(write)即「新建」。
使用hdf5-tools
工具組成員h5ls
來檢視匯出的HDF5檔案:
$ h5ls -r -d dftest.h5
/ Group
/df3 Group
/df3/axis0_label0 Dataset {4}
Data:
0, 0, 0, 0
/df3/axis0_label1 Dataset {4}
Data:
0, 1, 2, 3
/df3/axis0_level0 Dataset {1}
Data:
"value"
/df3/axis0_level1 Dataset {4}
Data:
"A", "B", "C", "D"
/df3/axis1 Dataset {3}
Data:
1672531200000000000, 1672617600000000000, 1672704000000000000
/df3/block0_items_label0 Dataset {4}
Data:
0, 0, 0, 0
/df3/block0_items_label1 Dataset {4}
Data:
0, 1, 2, 3
/df3/block0_items_level0 Dataset {1}
Data:
"value"
/df3/block0_items_level1 Dataset {4}
Data:
"A", "B", "C", "D"
/df3/block0_values Dataset {3, 4}
Data:
0.3, 6.3, 12.3, 18.3, 2.3, 8.3, 14.3, 20.3, 4.3, 10.3, 16.3, 22.3
這裡的HDF5檔案中的日期時間表示,是以奈秒為單位的UNIX時間紀元時間戳。這種儲存格式儲存了資料訊框的兩個軸[20]和所有的塊[21]。由於這裡只有一個塊,這個塊的items
的內容同於axis0
,而匯出前面的資料訊框df
之時,它的四個縱列會整合(consolidate
)為三個塊,其items
的併集同於axis0
。
儲存HDF5檔案還可採用表格('table'
)格式,HDF5檔案中這種儲存格式的群組,可以直接在其上進行查詢和刪除:
>>> df3.to_hdf('dftest.h5', key='df4', format='table', mode='a')
>>>
>>> pd.read_hdf('dftest.h5', key='df4', where='index > 20230101', columns=[('value', 'A'), ('value', 'C')])
value
variable A C
date
2023-01-02 2.3 14.3
2023-01-03 4.3 16.3
這裡的檔案打開模態'a'
是為「附加」(append)。
檢視變更後的HDF5檔案:
$ h5ls dftest.h5
df3 Group
df4 Group
$ h5ls -r dftest.h5/df4
/_i_table Group
/_i_table/index Group
/_i_table/index/abounds Dataset {0/Inf}
/_i_table/index/bounds Dataset {0/Inf, 127}
/_i_table/index/indices Dataset {0/Inf, 131072}
/_i_table/index/indicesLR Dataset {131072}
/_i_table/index/mbounds Dataset {0/Inf}
/_i_table/index/mranges Dataset {0/Inf}
/_i_table/index/ranges Dataset {0/Inf, 2}
/_i_table/index/sorted Dataset {0/Inf, 131072}
/_i_table/index/sortedLR Dataset {131201}
/_i_table/index/zbounds Dataset {0/Inf}
/table Dataset {3/Inf}
$ h5ls -d dftest.h5/df4/table
table Dataset {3/Inf}
Data:
{1672531200000000000, [0.3,6.3,12.3,18.3]},
{1672617600000000000, [2.3,8.3,14.3,20.3]},
{1672704000000000000, [4.3,10.3,16.3,22.3]}
這裡的_i_table/index
群組儲存了PyTables的tables.index
模組所存取的內容[22]。
匯出和匯入netCDF檔案可以藉助xarray
,它依賴於pandas,它通過netcdf4-python支援匯入匯出netCDF-4格式資料[23],通過SciPy支援其他版本netCDF格式。xarray
能夠在自身的資料陣列(DataArray
)與pandas的序列之間,在自身的資料集(Dataset
)與pandas的資料訊框之間,進行相互轉換[24]:
>>> df3.stack().shape
(12, 1)
>>>
>>> import xarray as xr
>>> df3.stack().to_xarray().to_netcdf('dftest.nc')
>>>
>>> df4 = xr.open_dataset('dftest.nc').to_dataframe().unstack()
>>> df4.shape
(3, 4)
使用netcdf-bin
工具組成員ncdump
來檢視匯出的netCDF檔案:
$ ncdump dftest.nc
netcdf dftest {
dimensions:
date = 3 ;
variable = 4 ;
variables:
int64 date(date) ;
date:units = "days since 2023-01-01 00:00:00" ;
date:calendar = "proleptic_gregorian" ;
string variable(variable) ;
double value(date, variable) ;
value:_FillValue = NaN ;
data:
date = 0, 1, 2 ;
variable = "A", "B", "C", "D" ;
value =
0.3, 6.3, 12.3, 18.3,
2.3, 8.3, 14.3, 20.3,
4.3, 10.3, 16.3, 22.3 ;
}
$ ncdump -k dftest.nc
netCDF-4
$ h5ls -r -d dftest.nc
/ Group
/date Dataset {3}
Data:
0, 1, 2
/value Dataset {3, 4}
Data:
0.3, 6.3, 12.3, 18.3, 2.3, 8.3, 14.3, 20.3, 4.3, 10.3, 16.3, 22.3
/variable Dataset {4}
Data:
"A", "B", "C", "D"
xarray
的日期時間表示遵循了氣候和預報元資料約定[25],這裡的時間單位為距離某個指定的開始日期時間的日數,曆法為前推格里高利曆。ncdump
的輸出採用了netCDF的「公用資料語言」(CDL)[26],它所稱謂的變數,代表相同類型的值的多維陣列,變數聲明指定了變數的資料類型、名字和以維度名字列表描述的形狀。這裡有三個變數:value
是資料變數,date
和variable
是坐標變數,而變數聲明double value(date, variable)
中,轉換得來的維度名字同於坐標變數名字。
參見
[編輯]參照
[編輯]- ^ 1.0 1.1 Release 2.2.3. 2024年9月20日 [2024年9月22日].
- ^ License – Package overview – pandas 1.0.0 documentation. pandas. 28 January 2020 [30 January 2020]. (原始內容存檔於2012-02-14).
- ^ Wes McKinney. pandas: a Foundational Python Library for Data Analysis and Statistics (PDF). 2011 [2 August 2018]. (原始內容 (PDF)存檔於2015-05-13).
- ^ McKinney, Wes. Python for Data Analysis, Second Edition. O'Reilly Media. 2017: 13. ISBN 9781491957660.
- ^ About pandas — History of development — Timeline. [2023-09-30]. (原始內容存檔於2023-10-10).
- ^ Python for Data Analysis, 3E. [2023-10-06]. (原始內容存檔於2023-11-07).
- ^ DataFrame. [2022-09-01]. (原始內容存檔於2022-09-01).
- ^ Indexing and selecting data. [2020-09-12]. (原始內容存檔於2020-09-15).
- ^ Merge, join, concatenate and compare. [2020-09-12]. (原始內容存檔於2020-09-15).
- ^ Reshaping and pivot tables. [2020-09-12]. (原始內容存檔於2020-09-15).
- ^ Essential basic functionality — Matching / broadcasting behavior. [2023-12-22]. (原始內容存檔於2024-04-21).
- ^ Intro to data structures — Data alignment and arithmetic. [2023-12-22]. (原始內容存檔於2022-09-01).
- ^ Working with missing data. [2023-12-22]. (原始內容存檔於2024-05-16).
- ^ IO tools (text, CSV, HDF5, …). [2020-09-12]. (原始內容存檔於2020-09-15).
- ^ McKinney, Wes. Apache Arrow and the "10 Things I Hate About pandas". wesmckinney.com. 21 September 2017 [21 December 2023]. (原始內容存檔於2024-05-25) (英語).
- ^ Python tools for data visualization — High-level tools. [2023-09-28]. (原始內容存檔於2023-09-28).
- ^ Pandas Plotting Backend in Python.
- ^ DuckDB Guides — SQL on Pandas. [2023-09-29]. (原始內容存檔於2023-10-03).
- ^ PyTables: hierarchical datasets in Python. [2023-09-28]. (原始內容存檔於2023-08-24).
- ^ What does axis in Pandas mean?. [2023-12-25]. (原始內容存檔於2023-12-25).
- ^ Internal Structure of Pandas DataFrames. [2023-12-25]. (原始內容存檔於2023-12-25).
- ^ Source code for tables.index. [2023-12-25]. (原始內容存檔於2023-12-25).
- ^ netcdf4-python: Python/numpy interface to the netCDF C library. [2023-10-07]. (原始內容存檔於2023-10-12).
- ^ xarray User Guide - Working with pandas. [2022-09-04]. (原始內容存檔於2022-09-04).
- ^ NetCDF Climate and Forecast (CF) Metadata Conventions — Time Coordinate. [2023-10-09]. (原始內容存檔於2023-10-12).
xarray User Guide — Weather and climate data. [2023-10-09]. (原始內容存檔於2023-10-12). - ^ Documentation for Common Data Language. [2023-12-26]. (原始內容存檔於2024-02-06).
延伸閱讀
[編輯]- McKinney, Wes. Python for Data Analysis: Data Wrangling with pandas, NumPy, and Jupyter 3rd Edition. O'Reilly. 2022 [2023-10-06]. ISBN 978-1-0981-0403-0. (原始內容存檔於2023-10-07).
- Chen, Daniel Y. Pandas for Everyone : Python Data Analysis 2nd Edition. Addison-Wesley. 2022 [2023-10-06]. ISBN 978-0-1378-9105-4. (原始內容存檔於2023-10-07).
- Molin, Stefanie. Hands-On Data Analysis with Pandas: Efficiently perform data collection, wrangling, analysis, and visualization using Python. Packt. 2019 [2023-10-06]. ISBN 978-1-7896-1532-6. (原始內容存檔於2023-10-07).
- VanderPlas, Jake. Python Data Science Handbook: Essential Tools for Working with Data. O'Reilly. 2016 [2023-10-06]. ISBN 978-1-4919-1205-8. (原始內容存檔於2023-10-08).
外部連結
[編輯]- Pathak, Chankey. Pandas Cookbook. 2018 [2023-10-06]. (原始內容存檔於2023-10-07).