【數據分析入門】Numpy進階

目錄

  • 一、數據重塑
    • 1.1 透視
    • 1.2 透視表
    • 1.3 堆棧/反堆棧
    • 1.3 融合
  • 二、迭代
  • 三、高級索引
    • 3.1 基礎選擇
    • 3.2 通過isin選擇
    • 3.3 通過Where選擇
    • 3.4 通過Query選擇
    • 3.5 設置/取消索引
    • 3.6 重置索引
      • 3.6.1 前向填充
      • 3.6.2 后向填充
    • 3.7 多重索引
  • 四、重復數據
  • 五、數據分組
    • 5.1 聚合
    • 5.2 轉換
  • 六、缺失值
  • 七、合并數據
    • 7.1 合并-Merge
    • 7.2 連接-Join
    • 7.3 拼接-Concatenate
      • 7.3.1 縱向拼接
      • 7.3.2 橫向/縱向拼接
  • 八、日期
  • 九、可視化


pandas 是一個功能強大的 Python 數據分析庫,為數據處理和分析提供了高效且靈活的工具。它是在 NumPy 的基礎上構建的,為處理結構化數據(如表格數據)時間序列數據提供了豐富的數據結構和數據操作方法

pandas 提供了兩種主要的數據結構:SeriesDataFrameSeries一維標記型數組,類似于帶標簽的列表,可以存儲不同類型的數據DataFrame二維的表格型數據結構,類似于關系型數據庫中的表格,它由多個 Series 組成,每個 Series 都有一個共同的索引。這使得 pandas 在處理和分析數據時非常方便和高效。

使用 pandas,我們就可以輕松地進行數據導入數據清洗數據轉換數據篩選數據分析等操作。它提供了豐富的函數和方法,如索引切片聚合合并排序統計繪圖等,使得數據分析變得簡單而直觀。

一、數據重塑

1.1 透視

??假設我們有一個 DataFrame df2,其中包含了 'Date’、‘Type’ 和 ‘Value’ 這三列數據。想要將 ‘Type’ 列的唯一值作為新 DataFrame 的列,‘Date’ 列作為新 DataFrame 的索引,并將 ‘Value’ 列中對應的值填充到新 DataFrame 的相應位置上
??即 將行變為列 ,我們可以這么實現代碼:

>>> df3= df2.pivot(index='Date',columns='Type', values='Value')

在這里插入圖片描述
??下面來對pivot() 函數的參數做一下說明:
??index:指定作為新 DataFrame 索引的列名,這里是 ‘Date’ 列。
??columns:指定作為新 DataFrame 列的列名,這里是 ‘Type’ 列的唯一值。
??values:指定填充到新 DataFrame 中的值的列名,這里是 ‘Value’ 列。

1.2 透視表

??使用了 pd.pivot_table() 函數創建一個透視表。pivot_table() 函數可以幫助我們在 pandas 中進行數據透視操作,并實現將一個 DataFrame 中的值按照指定的行和列進行聚合
??即 將行變為列,我們可以這么實現:

>>> df4 = pd.pivot_table(df2,values='Value',index='Date',columns='Type'])

??下面來解釋一下里面出現的各參數的含義:
??其中,‘df2’ 是原始的 DataFrame,‘Value’ 是要聚合的數值列名,‘Date’ 是新 DataFrame 的索引列名,而 ‘Type’ 是新 DataFrame 的列名
??pd.pivot_table() 函數會將 df2 中的數據按照 ‘Date’ 和 ‘Type’ 進行分組,并計算每個組中 ‘Value’ 列的聚合值(默認為均值)。然后,將聚合后的結果填充到新的 DataFrame df4 中,其中 每一行表示一個日期,每一列表示一個類型
??如果在透視表操作中存在重復的索引/列組合,pivot_table() 函數將會使用默認的聚合方法(均值)進行合并。如果我們想要使用其他聚合函數,可以通過傳遞 aggfunc 參數來進行設置,例如 aggfunc=‘sum’ 表示求和。

1.3 堆棧/反堆棧

??stack() 和 unstack() 是 pandas 中用于處理層次化索引的函數,可以在 多級索引的 DataFrame 中透視行和列標簽

>>> stacked = df5.stack() 
# 透視列標簽
# 使用 stack() 函數將列標簽透視,即將列標簽轉換為行索引,并將相應的數據堆疊起來。這樣可以創建一個具有多級索引的 Series
>>> stacked.unstack()
# 透視索引標簽
# 上述代碼則使用 unstack() 函數將索引標簽透視,即將行索引轉換為列標簽,并將相應的數據重新排列。這樣可以還原出原始的 DataFrame 結構

在這里插入圖片描述

1.3 融合

??我們需要 將指定的列轉換為一個觀察值列時,可以使用 pd.melt() 函數來將一個 DataFrame 進行融合操作(melt)
??將列轉為行:

>>> pd.melt(df2,id_vars=["Date"],value_vars=["Type","Value"],value_name="Observations")

在這里插入圖片描述
??其中,df2 是原始的 DataFrame,id_vars=[“Date”] 表示保持 ‘Date’ 列不融合,作為 標識變量也就是保持不動的列)。value_vars=[“Type”, “Value”] 指定要融合的列為 ‘Type’ 和 ‘Value’。value_name=“Observations” 表示新生成的觀察值列的名稱為 ‘Observations’。
??pd.melt() 函數將指定的列進行融合操作,并創建一個新的 DataFrame。融合后的 DataFrame 中會包含四列,分別是融合后的標識變量(‘Date’)融合的列名(‘variable’)融合的值(‘Observations’)以及原始 DataFrame 中對應的觀察值


二、迭代

??df.iteritems()是一個 DataFrame 的迭代器方法,用于按列迭代 DataFrame。它返回一個生成器,每次迭代生成一個包含列索引和對應列的序列的鍵值對
??df.iterrows() 也是一個 DataFrame 的迭代器方法,用于按行迭代 DataFrame。它返回一個生成器,每次迭代生成一個包含行索引和對應行的序列的鍵值對

>>> df.iteritems() 
# (列索引,序列)鍵值對
>>> df.iterrows()
# (行索引,序列)鍵值對

??下面是一些基本操作:

for column_index, column in df.iteritems():# 對每一列進行操作print(column_index)  # 打印列索引print(column)  # 打印列的序列for index, row in df.iterrows():# 對每一行進行操作print(index)  # 打印行索引print(row)  # 打印行的序列

三、高級索引

3.1 基礎選擇

??DataFrame 中基于條件選擇列的操作如下,都是一些基本的操作:

>>> df3.loc[:,(df3>1).any()] 
# 選擇任一值大于1的列
>>> df3.loc[:,(df3>1).all()] 
# 選擇所有值大于1的列
>>> df3.loc[:,df3.isnull().any()] 
# 選擇含 NaN值的列
>>> df3.loc[:,df3.notnull().all()] 
# 選擇含 NaN值的列

3.2 通過isin選擇

??而在很多情況下,我們所需要做的不是僅僅通過基于條件選擇列這么簡單的操作,所以還有必要學習 DataFrame 的進一步選擇和篩選操作

>>> df[(df.Country.isin(df2.Type))] 
# 選擇為某一類型的數值 
>>> df3.filter(items=”a”,”b”]) 
# 選擇特定值
>>> df.select(lambda x: not x%5) 
# 選擇指定元素

3.3 通過Where選擇

??where()是Pandas Series對象中的一個方法,也可以用于選擇滿足條件的子集

>>> s.where(s > 0)
# 選擇子集

3.4 通過Query選擇

>>> df6.query('second > first')
# 查詢DataFrame

??df6.query(‘second > first’)DataFrame 對象中的一個查詢操作,查詢 DataFrame df6 中滿足條件 “second > first” 的行。其中,“second” 和 “first” 是列名,表示要比較的兩個列。只有滿足條件的行會被選中并返回為一個新的 DataFrame


3.5 設置/取消索引

>>> df.set_index('Country')
# 設置索引
>>> df4 = df.reset_index()
# 取消索引
>>> df = df.rename(index=str,columns={"Country":"cntry","Capital":"cptl","Population":"ppltn"})
# 重命名DataFrame列名

3.6 重置索引

??有時候我們需要重新索引 Series
??將 Series s 的索引重新排列為 [‘a’, ‘c’, ‘d’, ‘e’, ‘b’],并返回一個新的 Series。如果 原來的索引中不存在某個新索引值對應的值將被設置為 NaN(缺失值)

>>> s2 = s.reindex(['a','c','d','e','b'])

3.6.1 前向填充

>>> df.reindex(range(4), method='ffill')Country Capital  Population0 Belgium Brussels 111908461 India  New Delhi 13031710352 Brazil  Brasília 2078475283 Brazil  Brasília 207847528

3.6.2 后向填充

>>> s3 = s.reindex(range(5), method='bfill')0 3 1 32 33 34 3

3.7 多重索引

>>> arrays = [np.array([1,2,3]),
np.array([5,4,3])]
>>> df5 = pd.DataFrame(np.random.rand(3, 2), index=arrays)
>>> tuples = list(zip(*arrays))
>>> index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
>>> df6 = pd.DataFrame(np.random.rand(3, 2), index=index)
>>> df2.set_index(["Date", "Type"]) 

四、重復數據

>>> s3.unique() 
# 返回唯一值
>>> df2.duplicated('Type')
# 查找重復值
>>> df2.drop_duplicates('Type', keep='last') 
# 去除重復值
>>> df.index.duplicated()
# 查找重復索引

五、數據分組

5.1 聚合

>>> df2.groupby(by=['Date','Type']).mean()
>>> df4.groupby(level=0).sum()
>>> df4.groupby(level=0).agg({'a':lambda x:sum(x)/len(x),
'b': np.sum})

5.2 轉換

>>> customSum = lambda x: (x+x%2)
>>> df4.groupby(level=0).transform(customSum)

六、缺失值

>>> df.dropna()
# 去除缺失值NaN
>>> df3.fillna(df3.mean())
# 用預設值填充缺失值NaN
>>> df2.replace("a", "f") 
# 用一個值替換另一個值

七、合并數據

7.1 合并-Merge

在這里插入圖片描述

>>> pd.merge(data1, data2, how='left', on='X1')

??將 data1data2 兩個 DataFrame 按照它們的 ‘X1’ 列進行左連接,并返回一個新的 DataFrame左連接保留 data1 的所有行,并將 data2 中符合條件的行合并到 data1 中。如果 data2 中沒有與 data1 匹配的行,則對應的列值將被設置為 NaN(缺失值)。
在這里插入圖片描述

>>> pd.merge(data1, data2, how='right', on='X1')

??右連接也是一種連接方式,其將 data1data2 兩個 DataFrame 按照它們的 ‘X1’ 列進行右連接,并返回一個新的 DataFrame保留 data2 的所有行,并將 data1 中符合條件的行合并到 data2 中。如果 data1 中沒有與 data2 匹配的行,則對應的列值將被設置為 NaN(缺失值)。
在這里插入圖片描述

>>> pd.merge(data1, data2,how='inner',on='X1')

??將 data1data2 兩個 DataFrame 按照它們的 ‘X1’ 列進行內連接,并返回一個新的 DataFrame就是所謂的內連接(inner join)。它 僅保留 data1 和 data2 中在 ‘X1’ 列上有匹配的行,并將它們合并到一起。
??參數中的 how=‘inner’ 表示使用內連接方式進行合并。其他可能的取值還有 ‘left’、‘right’ 和 ‘outer’,分別表示左連接右連接和接下來要介紹的外連接。on=‘X1’ 表示使用 ‘X1’ 列作為合并鍵(即共同的列)。
在這里插入圖片描述

>>> pd.merge(data1, data2, how='outer',on='X1')

??將 data1data2 兩個 DataFrame 按照它們的 ‘X1’ 列進行外連接,并返回一個新的 DataFrame。外連接(outer join)是一種合并方式,它會保留 data1 和 data2 中所有的行,并將它們根據 ‘X1’ 列的值進行合并。
??在外連接中,如果某個 DataFrame 中的行在另一個 DataFrame 中找不到匹配,那么對應的列值將被設置為 NaN(缺失值),表示缺失的數據


7.2 連接-Join

>>> data1.join(data2, how='right')

7.3 拼接-Concatenate

7.3.1 縱向拼接

>>> s.append(s2)

7.3.2 橫向/縱向拼接

>>> pd.concat([s,s2],axis=1, keys=['One','Two']) 
>>> pd.concat([data1, data2], axis=1, join='inner')

八、日期

>>> df2['Date']= pd.to_datetime(df2['Date'])
>>> df2['Date']= pd.date_range('2000-1-1', periods=6, freq='M')
>>> dates = [datetime(2012,5,1), datetime(2012,5,2)]
>>> index = pd.DatetimeIndex(dates)
>>> index = pd.date_range(datetime(2012,2,1), end, freq='BM')

九、可視化

Matplotlib 是一個用于繪制數據可視化圖形的 Python 庫。它提供了各種函數和工具,用于創建各種類型的圖表,包括線圖、散點圖、柱狀圖、餅圖等等。

??現在我們導入 Matplotlib 庫,并將其重命名為了 plt。這樣,我們就可以 使用 plt 對象來調用 Matplotlib 的函數和方法,以便創建和修改圖形了。

>>> import matplotlib.pyplot as plt

??現在,我們試試導入 Matplotlib 庫使用 Pandas 庫中 Series 對象.plot() 方法Matplotlib 庫中的 plt.show() 函數 來生成并顯示數據的默認圖形。

>>> s.plot()
>>> plt.show()

在這里插入圖片描述
我們也可使用 Pandas 庫中 DataFrame 對象.plot() 方法Matplotlib 庫 中的 plt.show() 函數 來生成并顯示數據的默認圖形。

>>> df2.plot()
>>> plt.show()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

回溯算法詳解

目錄 回溯算法詳解 回溯VS遞歸 回溯算法的實現過程 n個結點構造多本節要討論的是當給定 n(n>0)個結點時,可以構建多少種形態不同的樹。 回溯算法詳解 回溯算法,又稱為“試探法”。解決問題時,每進行一步&#…

主成分分析Python代碼

對于主成分分析詳細的介紹:主成分分析(PCA)原理詳解https://blog.csdn.net/zhongkelee/article/details/44064401 import numpy as np import pandas as pd標準PCA算法 def standeredPCA(data,N): #data:…

【golang】鏈表(List)

List實現了一個雙向鏈表,而Element則代表了鏈表中元素的結構。 可以把自己生成的Element類型值傳給鏈表嗎? 首先來看List的四種方法。 MoveBefore方法和MoveAfter方法,它們分別用于把給定的元素移動到另一個元素的前面和后面。 MoveToFro…

十種排序算法(附動圖)

排序算法 一、基本介紹 ? 排序算法比較基礎,但是設計到很多計算機科學的想法,如下: ? 1、比較和非比較的策略 ? 2、迭代和遞歸的實現 ? 3、分而治之思想 ? 4、最佳、最差、平均情況時間復雜度分析 ? 5、隨機算法 二、排序算法的分類 …

RabbitMq-1基礎概念

RabbitMq-----分布式中的一種通信手段 1. MQ的基本概念(message queue,消息隊列) mq:消息隊列,存儲消息的中間件 分布式系統通信的兩種方式:直接遠程調用,借助第三方完成間接通信 消息的發送方是生產者&#xff0c…

面試熱題(二叉樹的鋸齒形層次遍歷)

給你二叉樹的根節點 root ,返回其節點值的 鋸齒形層序遍歷 。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行) 輸入:root [3,9,20,null,null,15,7] 輸出:[[3…

MySQL數據庫-字符串函數詳解

前言 MySQL數據庫提供了多種不同類型的函數,用于處理字符串、日期、數值等數據類型,以及實現條件、聚合等操作,下面我們主要介紹字符串函數 CONCAT() 函數 CONCAT() 可用于將多個字符串連接在一起。 示例: SELECT CONCAT(Hell…

C++ STL stack queue

目錄 一.stack 介紹 二.stack 使用 三.stack 模擬實現 普通版本: 適配器版本: 四.queue的介紹 五. queue使用 六.queue模擬實現 七.deque介紹 1.容器適配器 2.deque的簡單介紹 3.deque的缺陷 4.為什么選擇deque作為stack和queue的底層默認容…

System.Text.Encoding不同字符編碼之間進行轉換

System.Text.Encoding 是 C# 中用于處理字符編碼和字符串與字節之間轉換的類。它提供了各種靜態方法和屬性,用于在不同字符編碼之間進行轉換,以及將字符串轉換為字節數組或反之。 在處理多語言文本、文件、網絡通信以及其他字符數據的場景中&#xff0c…

Spring Boot 獲取前端參數

Spring Boot 獲取前端參數 在開發 Web 應用程序時,前端參數是非常重要的。Spring Boot 提供了多種方法來獲取前端參數,本文將介紹其中的一些常用方法。 1. 使用 RequestParam 注解 RequestParam 注解是 Spring MVC 提供的一種常用方式,用于…

C++ 函數

函數是一組一起執行一個任務的語句。每個 C 程序都至少有一個函數,即主函數 main() ,所有簡單的程序都可以定義其他額外的函數。 您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常…

pycharm調整最大堆發揮最大

python程序運行時,怎么提高效率,設置pycharm最大堆過程如下; 一、進入設置pycharm最大堆; 二、進入設置pycharm最大堆; 如果8g設置為6g左右,占75%左右最佳

5個實用的 Vue 技巧

在這篇文章中,我們將探討五個實用的 Vue 技巧,這些技巧可以使你日常使用 Vue 編程更高效、更富有成效。無論你是Vue的初學者還是經驗豐富的開發者,這些技巧都能幫助你編寫更清晰、更簡潔、更有效的代碼。那么,讓我們開始吧。 1. …

9.1 C++ STL 排序、算數與集合

C STL(Standard Template Library)是C標準庫中的一個重要組成部分,提供了豐富的模板函數和容器,用于處理各種數據結構和算法。在STL中,排序、算數和集合算法是常用的功能,可以幫助我們對數據進行排序、統計…

【JVM】JVM中的分代回收

文章目錄 分代收集算法什么是分代分代收集算法-工作機制MinorGC、 Mixed GC 、 FullGC的區別是什么 分代收集算法 什么是分代 在java8時,堆被分為了兩份: 新生代和老年代【1:2】 其中: 對于新生代,內部又被分為了三…

eclipse常用設置

1、調整編輯頁面字體大小 窗口 (Window)- 首選項(Preferences)- 常規(General)- 外觀 (Appearence)- 顏色與字體 (Colors And Fonts),在右邊的對話框里選擇 Java - Java Editor Text Font,點擊出現的修改&…

【ARM 嵌入式 編譯系列 3.3 -- gcc 動態庫與靜態庫的鏈接方法介紹】

文章目錄 1.1 GCC 鏈接器 LD 介紹1.1.1 GCC 鏈接器 LD 常用參數介紹1.2 動態庫和靜態庫介紹1.2.1 動態庫和靜態庫優缺點1.2.2 庫文件鏈接方式1.2.3 ldd 工具介紹1.2.4 靜態庫鏈接時搜索路徑順序1.2.5 動態庫鏈接時、執行時搜索路徑順序1.2.6 頭文件搜索路徑1.2.7 有關環境變量上…

Neo4j之Aggregation基礎

在 Neo4j 中,聚合(Aggregation)是對數據進行計算、匯總和統計的過程。以下是一些使用聚合函數的常見例子,以及它們的解釋: 計算節點數量: MATCH (p:Person) RETURN count(p) AS totalPersons;這個查詢會計…

Socks5代理在多線程爬蟲中的應用

在進行爬蟲開發過程中,我們常常需要處理大量的數據,并執行多任務并發操作。然而,頻繁的請求可能會引起目標網站的反爬機制,導致IP封禁或限制訪問。為了規避這些限制,我們可以借助Socks5代理的強大功能,通過…

Nginx反向代理技巧

跨域 作為一個前端開發者來說不可避免的問題就是跨域,那什么是跨域呢? 跨域:指的是瀏覽器不能執行其他網站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對javascript施加的安全限制。瀏覽器的同源策略是指協議,域名…