對于Python而言,坊間早有這種說法:在有了 pandas之后,Python才算有了數據分析的能力。在此之前,要想用Python來做數據分析,可能就沒那么友好了,可見pandas在學習數據分析時候的重要程度。對于 pandas來說,很多功能的實現也是要基于科學計算庫 numpy的,所以 numpy+ pandas的組合在Python數據分析中就顯得尤為關鍵。
從本篇開始,小編就給大家詳細講解 pandas的基本用法和應用案例,熟悉R的朋友們也可以將其與R的數據分析功能進行對比,定能有所收獲。本篇先對 pandas的數據結構進行介紹,跟R大不相同的是,Python并沒有太多不同的數據結構和對象, pandas中主要包括 Series和 DataFrame兩種數據結構。
Series
Series有點類似于 numpy中的一維數組對象,一般由一組數據和數據相關的標簽或者索引構成,由一組數構成最簡單的 Series如下:
from numpy import *
from pandas import *
創建 Series:
obj = Series([-1,3,-4,6])
print(obj)
0 -1
1 3
2 -4
3 6
dtype: int64
可以看到的是,由一組數創建的 Series對象索引在左邊,值在右邊。我們也可以通過索引和值標簽分別訪問相應的對象:
#Series對象值
obj.values
array([-1, 3, -4, 6], dtype=int64)
#Series對象索引
obj.index
RangeIndex(start=0, stop=4, step=1)
當然,我們可以在創建Series對象的時候就對索引進行標記或者命名:
#對Series索引進行命名或者標記
obj2 = Series([-1,3,-4,6],index = ['a','b','c','d'])
print(obj2)
a -1
b 3
c -4
d 6
dtype: int64
#查看索引
obj2.index
Index(['a', 'b', 'c', 'd'], dtype='object')
根據 Series索引訪問對象值:
obj2['a']
-1
obj2[['a','b','c']]
a -1
b 3
c -4
dtype: int64
也可以對Series對象進行數組運算:
obj2[obj2 > 0]
b 3
d 6
dtype: int64
obj2*2
a -2
b 6
c -8
d 12
dtype: int64
np.exp(obj2)
a 0.367879
b 20.085537
c 0.018316
d 403.428793
dtype: float64
除了直接以數組形式創建 Series對象之外,通過字典來生成 Series也是較為普遍的做法:
nba = {'Kobe Bryant':30.3,'Allen Iverson':29.4,'Tracy McGrady':30.1,'Vince Carter':25.6}
obj3 = Series(nba)
print(obj3)
AllenIverson 29.4
KobeBryant 30.3
TracyMcGrady 30.1
VinceCarter 25.6
dtype: float64
創建完之后可以對 Series對象和索引進行命名:
obj3.name = 'nbastats'
obj3.index.name = 'player'
print(obj3)
player
AllenIverson 29.4
KobeBryant 30.3
TracyMcGrady 30.1
VinceCarter 25.6
Name: nbastats, dtype: float64
另外, Series索引可以隨時進行更改:
obj3.index = ['A.Iverson','K.Bryant','T.McGrady','V.Carter']
print(obj3)
A.Iverson 29.4
K.Bryant 30.3
T.McGrady 30.1
V.Carter 25.6
Name: nbastats, dtype: float64
除了上述創建 Series對象的方法以外,從 DataFrame中單獨拿出一行也可以用來創建 Series。關于 Series數據結構的基本內容就介紹到這里,下面看 DataFrame。
DataFrame
說到 DataFrame,可能大家更熟悉的是R語言中的 data.frame,Python中的 DataFrame跟它也較為類似。在Python中, DataFrame是一個表格型的數據結構,它含有一組有序的列,每列的數據類型可以不一樣,與R中的數據框相比,Python中的 DataFrame行列操作較為平衡。 構建DataFrame方法很多,最常用的是直接傳入一個由等長列表或NumPy數組組成的字典:
data = {'city':['LAL','HOU','PHI','TOR'],
'year':[1996,1997,1996,1997],
'score':[30.3,30.1,29.4,25.6]}
frame = DataFrame(data)
frame
city score year
0 LAL 30.3 1996
1 HOU 30.1 1997
2 PHI 29.4 1996
3 TOR 25.6 1997
可以看到,字典在轉化為數據框的過程中,鍵是作為列名而存在的。
#按指定列進行排列
DataFrame(data,columns=['year','city','score'])
year city score
0 1996 LAL 30.3
1 1997 HOU 30.1
2 1996 PHI 29.4
3 1997 TOR 25.6
根據字典傳入時,若是指定列找不到數據則會自動填補為缺失:
#若傳入的列找不到數據則會產生NA
frame2 = DataFrame(data,columns=['year','city','score','assist'],
index=[1,2,3,4])
print(frame2)
year city score assist
11996 LAL 30.3 NaN
21997 HOU 30.1 NaN
31996 PHI 29.4 NaN
41997 TOR 25.6 NaN
如前述,我們可以通過 data.frame來獲取一個 Series對象:
frame2['city']
1 LAL
2 HOU
3 PHI
4 TOR
Name: city, dtype: object
frame2.score
1 30.3
2 30.1
3 29.4
4 25.6
Name: score, dtype: float64
也可以通過 loc方法訪問 DataFrame的行:
frame2.loc[3]
year 1996
city PHI
score 29.4
assist NaN
Name: 3, dtype: object
對缺失的變量進行重新賦值:
frame2['assist']=5.6
print(frame2)
year city score assist
11996 LAL 30.3 5.6
21997 HOU 30.1 5.6
31996 PHI 29.4 5.6
41997 TOR 25.6 5.6
按索引傳入時,沒有被指定的記錄產生缺失:
val = Series([4.5,3.9],index=[1,4])
frame2['assist']=val
print(frame2)
year city score assist
11996 LAL 30.3 4.5
21997 HOU 30.1 NaN
31996 PHI 29.4 NaN
41997 TOR 25.6 3.9
對于嵌套字典轉化為 DataFrame,一般外層字典的鍵作為列,內層字典的鍵作為行索引:
nba = {'kobe':{2005:35.6,2006:32.1},'McGrady':{2005:26.7,2006:24.3}}
frame3 = DataFrame(nba)
print(frame3)
McGrady kobe
2005 26.735.6
2006 24.332.1
關于pandas的兩種基本數據結構Series和DataFrame,小編就暫且介紹到這里了,關于如何在實際的數據分析過程熟練使用這兩種數據結構的基本操作,小編在后續的推文中會進一步的講解。
-
數據分析
+關注
關注
2文章
1461瀏覽量
34184 -
python
+關注
關注
56文章
4810瀏覽量
85074
原文標題:利用pandas進行數據分析(一):Series和DataFrame數據結構
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Python的列表和元組兩種數據結構區別差異分析
![Python的列表和元組<b class='flag-5'>兩種數據結構</b>區別差異分析](https://file.elecfans.com/web1/M00/C8/51/pIYBAF9t96aAJA8PAAASQJD_BD0252.png)
數據結構是什么_數據結構有什么用
![<b class='flag-5'>數據結構</b>是什么_<b class='flag-5'>數據結構</b>有什么用](https://file1.elecfans.com//web2/M00/A6/EA/wKgZomUMQTmAITjkAAARDaPRhyE645.jpg)
java中幾種常用數據結構
![java中幾種常用<b class='flag-5'>數據結構</b>](https://file.elecfans.com/web1/M00/45/EA/o4YBAFp8Bo2AfkiyAAHDtBwE3BA943.png)
為什么要學習數據結構?數據結構的應用詳細資料概述免費下載
![為什么要學習<b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用詳細資料概述免費下載](https://file.elecfans.com/web1/M00/63/76/o4YBAFuXj0eAFNJeAABHI9ZdjH0530.png)
什么是數據結構?為什么要學習數據結構?數據結構的應用實例分析
![什么是<b class='flag-5'>數據結構</b>?為什么要學習<b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用實例分析](https://file.elecfans.com/web1/M00/65/7A/o4YBAFurOTuAdCq3AABVU-eOQhY072.png)
數據結構解決滑動窗口問題
![<b class='flag-5'>數據結構</b>解決滑動窗口問題](https://file1.elecfans.com/web2/M00/82/12/wKgZomQ_VnaAQFZyAABxunWA5D4826.jpg)
Linux內核中使用的數據結構
![Linux內核中使用的<b class='flag-5'>數據結構</b>](https://file1.elecfans.com/web2/M00/AF/06/wKgZomVMekqAGVOxAABbJpIMkco874.jpg)
評論