一、NumPy和Pandas間的區別與練習
- 功能定位
NumPy主要用于數值計算,提供了多維數組對象ndarray,支持數組操作、線性代數、隨機數生成等功能。
?Pandas則建立在NumPy之上,提供了更高級的數據結構,主要用于數據分析,尤其是處理表格化數據。
- 數據結構
NumPy的核心是多維數組對象ndarray,它可以表示任意維度的數組。
Pandas提供了兩種主要的數據結構:Series(一維標記數組)和DataFrame(二維帶標簽的數據表)。
- 索引方式
NumPy的數組只能使用整數索引訪問元素。
Pandas的Series和DataFrame可以使用標簽索引(如列名或行名)來訪問數據,也可以通過整數位置索引訪問。
- 擅長領域
NumPy特別擅長處理矩陣運算、數值計算等任務。
Pandas適合處理結構化的數據,如數據清洗、數據選擇、數據轉換等操作。
- 對缺失數據的處理
NumPy的數組不支持缺失數據,通常會用特殊值(如NaN)表示。
Pandas中的Series和DataFrame提供了更便捷的方法來處理缺失數據,如填充缺失值、刪除缺失值等。
- 其他區別
NumPy 比 Pandas 更快且內存效率更高。
NumPy 主要用于數值計算,而 Pandas 用于更廣泛的用途,例如數據分析和可視化。
NumPy 支持使用矩陣和數組數據格式,其中 Pandas 可以與表數據、Excel 文件、CSV 文件等一起使用。
NumPy 使用數組作為其主要對象,并且默認情況下也不索引。Pandas 使用系列和數據框作為其主要對象,并默認提供索引。
聯系:
DataFrame 的列是 Series 對象,可以通過列索引對列進行訪問和操作。
二、numpy
【介紹】
NumPy 是 Python 中的科學計算包/庫。它提供了一個多維的數組對象以及多個派生對象,例如屏蔽數組和矩陣。NumPy 包的核心是ndarray 。它負責封裝同質數據類型的 n 維數組,提供優化的代碼編譯,使其性能非常好。它從根本上用于執行數學和邏輯運算、實現基本線性代數、操作數組形狀、排序和選擇、I/O、執行離散傅立葉變換等。
【使用numpy的原因及其優勢】
快:雖然 Python 列表也是數組,但這些列表的處理時間比 NumPy 數組慢 50 倍,使其成為執行數值和科學計算的最流行的庫。(列表存儲在隨機內存位置,需要更長的時間來訪問和處理;NumPy 數組作為 ndarray 存儲在一個連續的內存位置,使得操作和計算非常高效和優化)
便利:在 NumPy 中,數組對象稱為ndarray,它提供了許多附加功能,使其更快、更易于使用。
1、列表與numpy的區別
- Python 列表可以動態增長,而 NumPy 數組在創建時的大小是固定的。因此,當我們更改ndarray的大小時,它會刪除原始數組并創建一個新數組。
- 在計算高級數學和包含大量數據的各種其他類型的運算時,NumPy 的性能要高得多。使用 Python 進行計算需要更多代碼,而且效率不如 NumPy。
- NumPy 數組的所有元素的數據類型都相同,因此與 Python 數組不同,它占用固定的內存大小。然而,有一個例外,即可以擁有對象數組(Python 以及 Numpy),允許數組使用不同大小的元素。
- 許多科學界使用基于 Python 的軟件包進行高級計算,其中都包含 NumPy 數組。基于 Python 的序列通常會在預處理數據時轉換為 NumPy 數組,并將結果輸出為 NumPy 數組。因此,編寫高效的基于 Python 的科學計算需要 NumPy 數組的知識。
2、narray的重要屬性
- ndarray.shape?– 它輸出數組維度。對于包含n 行和m 列的矩陣,形狀將為(n, m)。要獲取給定 array 的軸數,請使用 ndarray.ndim 。
- ndarray.dtype?– 它描述數組中包含的元素的數據類型。我們還可以使用標準 Python 指定數據類型。NumPy 還提供了自己的附加數據類型。其中一些示例是numpy.int16、numpy.int32和numpy.float64。
- ndarray.itemsize?– 它輸出給定數組的每個元素的大小(以字節為單位)。它與使用ndarray.dtype.itemsize相同。舉例來說,我們有一個包含float64類型元素的數組。它的項目大小將為8 ,這是64/8的結果。另一種情況是當包含的數據類型是complex32時。它的項目大小將為4,即32/8。
- ndarray.data?– 它返回保存數組的內存位置或緩沖區。它不經常使用,因為我們使用索引作為對該內存位置的引用來獲取數組中包含的元素。
3、NumPy 中的通用函數
exp、sin、cos、add、sqrt等數學函數在 Numpy 中稱為通用函數或ufunc?
4、解釋 NumPy 中的術語“廣播”
每當我們有不同維度的數組時,NumPy 都會以統一的方式處理它們,同時執行算術、函數、按位以及邏輯運算。這稱為廣播。它用于解釋逐個元素隱式完成的操作行為。
5、如何將一維數組轉換為二維數組?
使用NumPy 提供的np.newaxis和np.expand_dims函數。
6、解釋NumPy 中復制和視圖之間的主要區別
當我們在numpy中使用copy() 函數時,它會創建一個全新的數組。我們在原始數組中所做的更改不會反映在其復制版本中。另一方面,view()函數只是原始數組的反射。無論我們在原始數組中進行什么更改,也都將在使用視圖函數調用的數組中實現。
7、用numpy創建DataFrame
#數組創建
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#用np創建dataframe
frame4 = pd.DataFrame(np.arange(9).reshape(3, 3),index=['a', 'c', 'd'],columns=['Ohio', 'Texas', 'California'])
三、pandas
3.1、pandas中的series
【定義】一種類似于一維數組的對象,它由一組數據(各種Numpy數據類型)以及一組與之相關的數據標簽(即索引)組成。
1、series的建立【列表、字典】、讀取、改變(值和索引)、計算、找索引是否在、檢查缺失值、命名、對其并執行運算
#建立
obj = pd.Series([4, 7, -5, 3])
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
#查詢
obj.values
obj.index
obj4.name
obj4.index.name
#運算
import numpy as np
np.exp(obj2)
#####in是看索引
'b' in obj2#false
#看空
pd.isnull(obj3)
obj4.isnull()#類方法
2、索引
Pandas 中的 Series 的索引(index)實際上是一個包含每個元素標簽的對象,這個對象的數據類型是 pd.Index。在索引為數字 0 1 2 3 的 Series 中,這些標簽是整數,而在以字母 a b c d 為索引的 Series 中,這些標簽是字符串。從數據處理角度來看,這兩種類型的索引都能夠進行各種類型的計算和處理。 但是在實際應用中,這兩種類型的索引可能存在差異,例如在使用 loc 或 iloc 進行索引時,整數索引可能會造成歧義,因為整數索引和行號索引的用法相同而且重合。在這種情況下,最好使用明確的字符串標簽作為 Series 的索引。
3.2、pandas中的DataFrame
DataFrame就像SPSS的數據文件、R的數據框,SAS的dataset
1、dataframe的建立——利用字典
#建立
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002, 2003], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}frame = pd.DataFrame(data)
frame.head()
#通過指定列名順序,可以改變變量順序
pd.DataFrame(data, columns = ['year', 'state', 'pop'])
#指定行列標簽
frame2 = pd.DataFrame(data, columns = ['year', 'state', 'pop', 'debt'], index = ['one', 'two', 'three', 'four', 'five', 'six'])
pop = {'Nevada': {2001: 2.4, 2002: 2.9, 2003:3.2},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop)#2001是行索引
2、DataFrame的索引
包含行索引和列索引
#行列索引——先取列再取行
#-1就是最后一行
frame3['Nevada'][:2]#讀取列——左行右列
frame2.iloc[1:3,]
#loc是靠label定位或者布爾值,iloc是按照整數的順序定位
frame2.iloc[1:3,0:2]bool_arr=frame2['pop']>2
result =frame2.loc[bool_arr,]
也可以用切片
3、其他
命名:
#命名和單元格值
frame3.index.name = 'year'; frame3.columns.name = 'state'
frame3.values#這樣輸出的是會是數組
?刪除
del frame2['year']
自動識別缺失
series合進DataFrame
把series賦給DataFrame,會按DataFrame的index來合并,不夠的地方用缺失數據來表示:
frame2['debt'] = val
?