數據分析入門——Pandas類庫基礎知識

来源:https://www.cnblogs.com/airnew/archive/2019/03/20/10562740.html
-Advertisement-
Play Games

使用python進行數據分析時,經常會用Pandas類庫處理數據,將數據轉換成我們需要的格式。Pandas中的有兩個數據結構和處理數據相關,分別是Series和DataFrame。 Series Series是一種類似於一維數組的對象,它有兩個屬性,value和index索引。可以像數組那樣通過索引 ...


使用python進行數據分析時,經常會用Pandas類庫處理數據,將數據轉換成我們需要的格式。Pandas中的有兩個數據結構和處理數據相關,分別是Series和DataFrame。

Series

Series是一種類似於一維數組的對象,它有兩個屬性,value和index索引。可以像數組那樣通過索引訪問對應的值,它和數組有點類似也是python中的dict有點類似,數組中的索引只能是數字,而Series的索引既可以是數字類型也可以是字元類型。

創建Series對象
最簡單的方式是通過list序列就可以創建Series對象

s1 = Series(['a','b','c','d'])
s1
Out[16]: 
0    a
1    b
2    c
3    d

沒有指定索引時,會預設生成一個從0開始到N-1的整型索引。

Series會根據傳入的list序列中元素的類型判斷Series對象的數據類型,如果全部都是整型,則創建的Series對象是整型,如果有一個元素是浮點型,則創建的Series對象是浮點型,如果有一個是字元串,則創建的Series對象是object類型。

s1 = Series([1,2,3,4])
s1
Out[23]: 
0    1
1    2
2    3
3    4
dtype: int64
s2 = Series([1,2,3,4.0])
s2
Out[25]: 
0    1.0
1    2.0
2    3.0
3    4.0
dtype: float64
s3 = Series([1,2,3,'4'])
s3
Out[27]: 
0    1
1    2
2    3
3    4
dtype: object

除了通過list序列創建Series對象外,還可以通過dict創建Series對象。

s1 = Series({'a':1,'b':2,'c':3,'d':4})
s1
Out[37]: 
a    1
b    2
c    3
d    4
dtype: int64

通過dict詞典創建Series對象時,會將詞典的鍵初始化Series的Index,而dict的value初始化Series的value。

Series還支持傳入一個dict詞典和一個list序列創建Series對象:

dict1 = {'a':1,'b':2,'c':3,'d':4}
index1 = ['a','b','e']
s1 = Series(dict1,index=index1)
s1
Out[51]: 
a    1.0
b    2.0
e    NaN
dtype: float64

上面的代碼中,指定了創建的Series對象s1的索引是index1,即'a','b'和'e'。s1的值是dict1中和index1索引相匹配的值,如果不匹配,則顯示NaN。例如索引'e'和dict1中的鍵沒有相匹配的,則索引'e'的值為NaN。索引'a'和索引'b'都匹配得上,因此值為1和2。

Series通過索引訪問值:

s1 = Series({'a':1,'b':2,'c':3,'d':4})
s1
Out[39]: 
a    1
b    2
c    3
d    4
dtype: int64
s1['b']
Out[40]: 2

上面代碼中通過s1['b']就可以訪問到索引b對應的值。

Series支持邏輯和數學運算:

s1 = Series([2,5,-10,200])
s1 * 2
Out[53]: 
0      4
1     10
2    -20
3    400
dtype: int64
s1[s1>0]
Out[54]: 
0      2
1      5
3    200
dtype: int64

對Series變數做數學運算,會作用於Series對象中的每一個元素。

s1 = Series([2,5,-10,200])
s1[s1>0]
Out[7]: 
0      2
1      5
3    200
dtype: int64

對Series做邏輯運算時,會將Series中的值替換為bool類型的對象。

s1 = Series([2,5,-10,200])
s1
Out[10]: 
0      2
1      5
2    -10
3    200
dtype: int64
s1 > 0
Out[11]: 
0     True
1     True
2    False
3     True
dtype: bool

通過series的邏輯運算,可以過濾掉一些不符合條件的數據,例如過濾掉上面例子中小於0的元素:

s1 = Series([2,5,-10,200])
s1[s1 >0]
Out[23]: 
0      2
1      5
3    200
dtype: int64

Series對象和索引都有一個name屬性,通過下麵的方法可以設置Series對象和索引的name值:

fruit = {0:'apple',1:'orange',2:'banana'} 
fruitSeries = Series(fruit)
fruitSeries.name='Fruit'
fruitSeries
Out[27]: 
0     apple
1    orange
2    banana
Name: Fruit, dtype: object
fruitSeries.index.name='Fruit Index'
fruitSeries
Out[29]: 
Fruit Index
0     apple
1    orange
2    banana
Name: Fruit, dtype: object

可以通過index複製方式直接修改Series對象的index:

fruitSeries.index=['a','b','c']
fruitSeries
Out[31]: 
a     apple
b    orange
c    banana
Name: Fruit, dtype: object

DataFrame

DataFrame是表格型的數據結構,和關係型資料庫中的表很像,都是行和列組成,有列名,索引等屬性。

我們可以認為DataFrame中的列其實就是上面提到的Series,有多少列就有多少個Series對象,它們共用同一個索引index。

通過dict字典創建DataFrame對象:

data = {'fruit':['Apple','Apple','Orange','Orange','Banana'],
'year':[2010,2011,2012,2011,2012],
'sale':[15000,17000,36000,24000,29000]}
frame = DataFrame(data)
frame
Out[12]: 
    fruit  year   sale
0   Apple  2010  15000
1   Apple  2011  17000
2  Orange  2012  36000
3  Orange  2011  24000
4  Banana  2012  29000

使用上面的方式創建DataFrame對象時,字典中每個元素的value值必須是列表,並且長度必須一致,如果長度不一致會報錯。例如key為fruit、year、sale對應的列表長度必須一致。

創建DataFrame對象和會創建Series對象一樣自動加上索引。

通過傳入columns參數指定列的順序:

data = {'fruit':['Apple','Apple','Orange','Orange','Banana'],
'year':[2010,2011,2012,2011,2012],
'sale':[15000,17000,36000,24000,29000]}
frame = DataFrame(data,columns=['sale','fruit','year','price'])
frame
Out[25]: 
    sale   fruit  year price
0  15000   Apple  2010   NaN
1  17000   Apple  2011   NaN
2  36000  Orange  2012   NaN
3  24000  Orange  2011   NaN
4  29000  Banana  2012   NaN

如果傳入的列在數據中找不到,就會產生NaN值。

DataFrame的index也是可以修改的,同樣傳入一個列表:

frame = DataFrame(data,columns=['sale','fruit','year'],index=[4,3,2,1,0])
frame
Out[22]: 
    sale   fruit  year
4  15000   Apple  2010
3  17000   Apple  2011
2  36000  Orange  2012
1  24000  Orange  2011
0  29000  Banana  2012

通過傳入的[4,3,2,1,0]就將原來的index從0,1,2,3,4改變為4,3,2,1,0。

通過DataFrame對象獲取Series對象:

frame['year']
Out[26]: 
0    2010
1    2011
2    2012
3    2011
4    2012
Name: year, dtype: int64
frame['fruit']
Out[27]: 
0     Apple
1     Apple
2    Orange
3    Orange
4    Banana
Name: fruit, dtype: object

frame['fruit']和frame.fruit都可以獲取列,並且返回的是Series對象。

DataFrame賦值,就是對列賦值,首先獲取DataFrame對象中某列的Series對象,然後通過賦值的方式就可以修改列的值:

data = {'fruit':['Apple','Apple','Orange','Orange','Banana'],
'year':[2010,2011,2012,2011,2012],
'sale':[15000,17000,36000,24000,29000]}
frame = DataFrame(data,columns=['sale','fruit','year','price'])
frame
Out[24]: 
    sale   fruit  year price
0  15000   Apple  2010   NaN
1  17000   Apple  2011   NaN
2  36000  Orange  2012   NaN
3  24000  Orange  2011   NaN
4  29000  Banana  2012   NaN
frame['price'] = 20
frame
Out[26]: 
    sale   fruit  year  price
0  15000   Apple  2010     20
1  17000   Apple  2011     20
2  36000  Orange  2012     20
3  24000  Orange  2011     20
4  29000  Banana  2012     20
frame.price = 40
frame
Out[28]: 
    sale   fruit  year  price
0  15000   Apple  2010     40
1  17000   Apple  2011     40
2  36000  Orange  2012     40
3  24000  Orange  2011     40
4  29000  Banana  2012     40
frame.price=np.arange(5)
frame
Out[30]: 
    sale   fruit  year  price
0  15000   Apple  2010      0
1  17000   Apple  2011      1
2  36000  Orange  2012      2
3  24000  Orange  2011      3
4  29000  Banana  2012      4

通過frame['price']或者frame.price獲取price列,然後通過frame['price']=20或frame.price=20就可以將price列都賦值為20。

也可以通過numpy的arange方法進行賦值。如上面的代碼所示。

可以通過Series給DataFrame對象賦值:

data = {'fruit':['Apple','Apple','Orange','Orange','Banana'],
'year':[2010,2011,2012,2011,2012],
'sale':[15000,17000,36000,24000,29000]}
frame = DataFrame(data,columns=['sale','fruit','year','price'])
frame
Out[6]: 
    sale   fruit  year price
0  15000   Apple  2010   NaN
1  17000   Apple  2011   NaN
2  36000  Orange  2012   NaN
3  24000  Orange  2011   NaN
4  29000  Banana  2012   NaN
priceSeries = Series([3.4,4.2,2.4],index = [1,2,4])
frame.price = priceSeries
frame
Out[9]: 
    sale   fruit  year  price
0  15000   Apple  2010    NaN
1  17000   Apple  2011    3.4
2  36000  Orange  2012    4.2
3  24000  Orange  2011    NaN
4  29000  Banana  2012    2.4

這種賦值方式,DataFrame的索引會和Series的索引自動匹配,在對應的索引位置賦值,匹配不上的位置將填上缺失值NaN。

創建的Series對象如果不指定索引時的賦值結果:

priceSeries = Series([3.4,4.2,2.4])
frame.price = priceSeries
frame
Out[12]: 
    sale   fruit  year  price
0  15000   Apple  2010    3.4
1  17000   Apple  2011    4.2
2  36000  Orange  2012    2.4
3  24000  Orange  2011    NaN
4  29000  Banana  2012    NaN

DataFrame還支持通過列表或者數組的方式給列賦值,但是必須保證兩者的長度一致:

priceList=[3.4,2.4,4.6,3.8,7.3]
frame.price=priceList
frame
Out[15]: 
    sale   fruit  year  price
0  15000   Apple  2010    3.4
1  17000   Apple  2011    2.4
2  36000  Orange  2012    4.6
3  24000  Orange  2011    3.8
4  29000  Banana  2012    7.3
priceList=[3.4,2.4,4.6,3.8,7.3]
frame.price=priceList

賦值的列如果不存在時,相當於創建出一個新列:

frame['total'] = 30000
frame
Out[45]: 
    sale   fruit  year  price  total
0  15000   Apple  2010    3.4  30000
1  17000   Apple  2011    2.4  30000
2  36000  Orange  2012    4.6  30000
3  24000  Orange  2011    3.8  30000
4  29000  Banana  2012    7.3  30000

上面的例子通過給不存在的列賦值,新增了新列total。必須使用frame['total']的方式賦值,不建議使用frame.total,使用frame.的方式給不存在的列賦值時,這個列會隱藏起來,直接輸出DataFrame對象是不會看到這個total這個列的,但是它又真實的存在,下麵的代碼是分別使用frame['total']和frame.total給frame對象的total列賦值,total列開始是不存在的:

frame
Out[60]: 
    sale   fruit  year  price
0  15000   Apple  2010    3.4
1  17000   Apple  2011    2.4
2  36000  Orange  2012    4.6
3  24000  Orange  2011    3.8
4  29000  Banana  2012    7.3
frame.total = 20
frame
Out[62]: 
    sale   fruit  year  price
0  15000   Apple  2010    3.4
1  17000   Apple  2011    2.4
2  36000  Orange  2012    4.6
3  24000  Orange  2011    3.8
4  29000  Banana  2012    7.3
frame['total'] = 20
frame
Out[64]: 
    sale   fruit  year  price  total
0  15000   Apple  2010    3.4     20
1  17000   Apple  2011    2.4     20
2  36000  Orange  2012    4.6     20
3  24000  Orange  2011    3.8     20
4  29000  Banana  2012    7.3     20

使用frame.total方式賦值時,是看不到total這一列的,而用frame['total']方式賦值時,則可以看到total這一列。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue簡介 前面安裝好vue之後,確實還沒有對vue進行介紹,首先,官網:傳送門 接著,前端目前公認有三大框架:vue,react,angular react是fackbook公司出的框架,angular是谷歌公司出的框架,vue是一個國人寫的,叫尤雨溪,他之前是在谷歌上班的,... ...
  • wx.setStorageSync('vipId',vipId) 存儲 wx.getStorageSync('vipId') 讀取 wx.navigateTo({ url: `/pages/detail/main?id=${id}` }) 頁面之間跳轉傳遞參數 如果需要傳遞整個對象,如下: goPa ...
  • 十行原生代碼,不引入任何 JS 庫,目前各大瀏覽器與移動平臺都可相容。 ...
  • Thrift的基本結束 Thrift是一個跨語言的服務部署框架,最初由Facebook於2007年開發,2008年進入Apache開源項目。Thrift通過IDL(Interface Definition Language,介面定義語言)來定義RPC(Remote Procedure Call,遠程 ...
  • Spring Boot的由來 相信大家都聽說過Spring框架。 Spring從誕生到現在一直是流行的J2EE開發框架。 隨著Spring的發展,它的功能越來越強大,隨之而來的缺點也越來越明顯,以至於發展到後來變得越來越臃腫,使用起來也非常的麻煩。 到後來由於過於強調配置的靈活性,有時即使只為了加入 ...
  • Template Method(模板方法模式) 將具體處理交給子類 Template Method 就是定義一個操作中的演算法骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構可以定義該演算法的某些特定步驟 。 簡單地說就是 用一些抽象的操作定義一個演算法,而子類將重定義這些操作以提供具體的 ...
  • 假設大家已經安裝好python的環境了。 Windows檢查是否可以運行python腳本 Ctrl+R 輸入 cmd 在命令行中輸入python 如果出現下麵結果,我們就可以開始python的學習了。 第一個python腳本 我使用的python自帶的python shell學習的代碼 打開的視窗如 ...
  • 跨域問題是由於瀏覽器為了防止CSRF攻擊(Cross-site request forgery跨站請求偽造),避免惡意攻擊而帶來的風險而採取的同源策略限制。當一個頁面中使用XMLHTTPRequest(XHR請求)對象發送HTTP請求時,必須保證當前頁面和請求的對象是同源的,即協議、功能變數名稱和埠號要完 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...