Pandas基本教程

Pandas 是 Python 的核心數據分析支持庫,提供了快速、靈活、明確的數據結構,旨在簡單、直觀地處理關係型、標記型數據。Pandas 的目標是成爲 Python 數據分析實踐與實戰的必備高級工具,其長遠目標是成爲最強大、最靈活、可以支持任何語言的開源數據分析工具。經過多年不懈的努力,Pandas 離這個目標已經越來越近了。

Pandas 適用於處理以下類型的數據:

與 SQL 或 Excel 表類似的,含異構列的表格數據;
有序和無序(非固定頻率)的時間序列數據;
帶行列標籤的矩陣數據,包括同構或異構型數據;
任意其它形式的觀測、統計數據集, 數據轉入 Pandas 數據結構時不必事先標記。

Pandas 的主要數據結構是 Series(一維數據)與 DataFrame(二維數據),這兩種數據結構足以處理金融、統計、社會科學、工程等領域裏的大多數典型用例。對於 R 用戶,DataFrame 提供了比 R 語言 data.frame 更豐富的功能。Pandas 基於 NumPy 開發,可以與其它第三方科學計算支持庫完美集成。

Pandas 就像一把萬能瑞士軍刀,下面僅列出了它的部分優勢 :

處理浮點與非浮點數據裏的缺失數據,表示爲 NaN; 大小可變:插入或刪除 DataFrame 等多維對象的列;
自動、顯式數據對齊:顯式地將對象與一組標籤對齊,也可以忽略標籤,在 Series、DataFrame 計算時自動與數據對齊;
強大、靈活的分組(group by)功能:拆分-應用-組合數據集,聚合、轉換數據; 把 Python 和 NumPy
數據結構裏不規則、不同索引的數據輕鬆地轉換爲 DataFrame 對象; 基於智能標籤,對大型數據集進行切片、花式索引、子集分解等操作;
直觀地合併(merge)、**連接(join)**數據集; 靈活地重塑(reshape)、**透視(pivot)**數據集;
軸支持結構化標籤:一個刻度支持多個標籤; 成熟的 IO 工具:讀取文本文件(CSV 等支持分隔符的文件)、Excel
文件、數據庫等來源的數據,利用超快的 HDF5 格式保存 / 加載數據;
時間序列:支持日期範圍生成、頻率轉換、移動窗口統計、移動窗口線性迴歸、日期位移等時間序列功能。

這些功能主要是爲了解決其它編程語言、科研環境的痛點。處理數據一般分爲幾個階段:數據整理與清洗、數據分析與建模、數據可視化與製表,Pandas 是處理數據的理想工具。

其它說明:
Pandas 速度很快。Pandas 的很多底層算法都用 Cython 優化過。然而,爲了保持通用性,必然要犧牲一些性能,如果專注某一功能,完全可以開發出比 Pandas 更快的專用工具。Pandas 是 statsmodels 的依賴項,因此,Pandas 也是 Python 中統計計算生態系統的重要組成部分。Pandas 已廣泛應用於金融領域。

#數據結構

維數 名稱 描述
1 Series 帶標籤的一維同構數組
2 DataFrame 帶標籤的,大小可變的,二維異構表格

用值列表生成 Series 時,Pandas 默認自動生成整數索引:

In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8])

In [4]: s
Out[4]: 
0    1.0
1    3.0
2    5.0
3    NaN
4    6.0
5    8.0

dtype: float64

用含日期時間索引與標籤的 NumPy 數組生成 DataFrame:

In [5]: dates = pd.date_range('20130101', periods=6)

In [6]: dates
Out[6]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

In [7]: df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))

In [8]: df
Out[8]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

用 Series 字典對象生成 DataFrame:

In [9]: df2 = pd.DataFrame({'A': 1.,
   ...:                     'B': pd.Timestamp('20130102'),
   ...:                     'C': pd.Series(1, index=list(range(4)), dtype='float32'),
   ...:                     'D': np.array([3] * 4, dtype='int32'),
   ...:                     'E': pd.Categorical(["test", "train", "test", "train"]),
   ...:                     'F': 'foo'})
   ...: 

In [10]: df2
Out[10]: 
     A          B    C  D      E    F
0  1.0 2013-01-02  1.0  3   test  foo
1  1.0 2013-01-02  1.0  3  train  foo
2  1.0 2013-01-02  1.0  3   test  foo
3  1.0 2013-01-02  1.0  3  train  foo

下列代碼說明如何查看 DataFrame 頭部和尾部數據:

In [13]: df.head()
Out[13]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

In [14]: df.tail(3)
Out[14]: 
                   A         B         C         D
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-05 -0.424972  0.567020  0.276232 -1.087401
2013-01-06 -0.673690  0.113648 -1.478427  0.524988

顯示索引與列名:

In [15]: df.index
Out[15]: 
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
               '2013-01-05', '2013-01-06'],
              dtype='datetime64[ns]', freq='D')

In [16]: df.columns
Out[16]: Index(['A', 'B', 'C', 'D'], dtype='object')

下面的 df 這個 DataFrame 裏的值都是浮點數,DataFrame.to_numpy() 的操作會很快,而且不復制數據。

In [17]: df.to_numpy()
Out[17]: 
array([[ 0.4691, -0.2829, -1.5091, -1.1356],
       [ 1.2121, -0.1732,  0.1192, -1.0442],
       [-0.8618, -2.1046, -0.4949,  1.0718],
       [ 0.7216, -0.7068, -1.0396,  0.2719],
       [-0.425 ,  0.567 ,  0.2762, -1.0874],
       [-0.6737,  0.1136, -1.4784,  0.525 ]])

describe() 可以快速查看數據的統計摘要:

In [19]: df.describe()
Out[19]: 
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.073711 -0.431125 -0.687758 -0.233103
std    0.843157  0.922818  0.779887  0.973118
min   -0.861849 -2.104569 -1.509059 -1.135632
25%   -0.611510 -0.600794 -1.368714 -1.076610
50%    0.022070 -0.228039 -0.767252 -0.386188
75%    0.658444  0.041933 -0.034326  0.461706
max    1.212112  0.567020  0.276232  1.071804

轉置數據:

In [20]: df.T
Out[20]: 
   2013-01-01  2013-01-02  2013-01-03  2013-01-04  2013-01-05  2013-01-06
A    0.469112    1.212112   -0.861849    0.721555   -0.424972   -0.673690
B   -0.282863   -0.173215   -2.104569   -0.706771    0.567020    0.113648
C   -1.509059    0.119209   -0.494929   -1.039575    0.276232   -1.478427
D   -1.135632   -1.044236    1.071804    0.271860   -1.087401    0.524988

按軸排序:

In [21]: df.sort_index(axis=1, ascending=False)
Out[21]: 
                   D         C         B         A
2013-01-01 -1.135632 -1.509059 -0.282863  0.469112
2013-01-02 -1.044236  0.119209 -0.173215  1.212112
2013-01-03  1.071804 -0.494929 -2.104569 -0.861849
2013-01-04  0.271860 -1.039575 -0.706771  0.721555
2013-01-05 -1.087401  0.276232  0.567020 -0.424972
2013-01-06  0.524988 -1.478427  0.113648 -0.673690

按值排序:

In [22]: df.sort_values(by='B')
Out[22]: 
                   A         B         C         D
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-06 -0.673690  0.113648 -1.478427  0.524988
2013-01-05 -0.424972  0.567020  0.276232 -1.087401

獲取數據

選擇單列,產生 Series,與 df.A 等效:

In [23]: df['A']
Out[23]: 
2013-01-01    0.469112
2013-01-02    1.212112
2013-01-03   -0.861849
2013-01-04    0.721555
2013-01-05   -0.424972
2013-01-06   -0.673690
Freq: D, Name: A, dtype: float64

用 [ ] 切片行:

In [24]: df[0:3]
Out[24]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

In [25]: df['20130102':'20130104']
Out[25]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860

按標籤選擇

用標籤提取一行數據:

In [26]: df.loc[dates[0]]
Out[26]: 
A    0.469112
B   -0.282863
C   -1.509059
D   -1.135632
Name: 2013-01-01 00:00:00, dtype: float64

用標籤選擇多列數據:

In [27]: df.loc[:, ['A', 'B']]
Out[27]: 
                   A         B
2013-01-01  0.469112 -0.282863
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020
2013-01-06 -0.673690  0.113648

用標籤切片,包含行與列結束點:

In [28]: df.loc['20130102':'20130104', ['A', 'B']]
Out[28]: 
                   A         B
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771

返回對象降維:

In [29]: df.loc['20130102', ['A', 'B']]
Out[29]: 
A    1.212112
B   -0.173215
Name: 2013-01-02 00:00:00, dtype: float64

提取標量值:

In [30]: df.loc[dates[0], 'A']
Out[30]: 0.46911229990718628

快速訪問標量,與上述方法等效:

In [31]: df.at[dates[0], 'A']
Out[31]: 0.46911229990718628

按位置選擇

用整數位置選擇:

In [32]: df.iloc[3]
Out[32]: 
A    0.721555
B   -0.706771
C   -1.039575
D    0.271860
Name: 2013-01-04 00:00:00, dtype: float64

類似 NumPy / Python,用整數切片:

In [33]: df.iloc[3:5, 0:2]
Out[33]: 
                   A         B
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020

類似 NumPy / Python,用整數列表按位置切片:

In [34]: df.iloc[[1, 2, 4], [0, 2]]
Out[34]: 
                   A         C
2013-01-02  1.212112  0.119209
2013-01-03 -0.861849 -0.494929
2013-01-05 -0.424972  0.276232

顯式整行切片:

In [35]: df.iloc[1:3, :]
Out[35]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

顯式整列切片:

In [36]: df.iloc[:, 1:3]
Out[36]: 
                   B         C
2013-01-01 -0.282863 -1.509059
2013-01-02 -0.173215  0.119209
2013-01-03 -2.104569 -0.494929
2013-01-04 -0.706771 -1.039575
2013-01-05  0.567020  0.276232
2013-01-06  0.113648 -1.478427

顯式提取值:

In [37]: df.iloc[1, 1]
Out[37]: -0.17321464905330858

快速訪問標量,與上述方法等效:

In [38]: df.iat[1, 1]
Out[38]: -0.17321464905330858

描述性統計,求均值:

In [61]: df.mean()
Out[61]: 
A   -0.004474
B   -0.383981
C   -0.687758
D    5.000000
F    3.000000
dtype: float64
連接(join)

SQL 風格的合併。 詳見數據庫風格連接。

In [77]: left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})

In [78]: right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})

In [79]: left
Out[79]: 
   key  lval
0  foo     1
1  foo     2

In [80]: right
Out[80]: 
   key  rval
0  foo     4
1  foo     5

In [81]: pd.merge(left, right, on='key')
Out[81]: 
   key  lval  rval
0  foo     1     4
1  foo     1     5
2  foo     2     4
3  foo     2     5

Reference
pandas中文教程
數據分析教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章