【技術積累】Python中的Pandas庫【三】

来源:https://www.cnblogs.com/yyyyfly1/archive/2023/06/11/17472852.html
-Advertisement-
Play Games

博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...


什麼是Series

Series是一種帶有標簽的一維數組,可以容納各種類型的數據(例如整數,浮點數和字元串)。每個Series對象都有一個索引,它可以用來引用每個元素。Series對象的主要特征是可以進行矢量化操作(即一次對整個序列進行操作),因此非常適合處理數值數據。

什麼是DataFrame?

DataFrame是一個帶有標簽的二維數據結構,可以容納各種類型的數據(例如整數,浮點數和字元串)。每個DataFrame對象都由行和列組成,行表示一個實例,列表示屬性。您可以將DataFrame視為電子錶格或SQL表。DataFrame的主要特征是可以進行矢量化操作,因此非常適合處理具有多種屬性的數據。此外,DataFrame還具有一些其他功能,例如靈活的數據對齊,分組和聚合,數據排序和合併等。

Pandas庫中的Index對象是什麼?

Pandas庫中的Index對象是一種存儲軸標簽的不可變數據結構。它可以看做是Series和DataFrame的標識符,它們用來標識單個條目或多個相同類型的數據。Index可以是整數、字元串或自定義類型的對象,它們的主要功能包括:查找、切片、分組、聚合等。

Index對象的特點有以下幾個方面:

  1. 不可變性:一旦創建,Index對象的元素不能被修改。
  2. 唯一性:Index對象中的元素必須是唯一的,否則會引發異常。
  3. 有序性:Index對象的元素可以按照定義的順序排列,搜索和切片更高效。

Index對象可以通過多種方式創建,例如從一個列表、數組、元組、字典、DataFrame等對象中創建,也可以手動創建。在DataFrame中,行和列都有自己的Index對象,而在Series中,只有一維的數據和一個Index對象。利用Index對象,可以很方便地對數據進行索引、排序和子集切片等操作,提高了數據處理的效率。

如何創建Series?

1.通過列表或數組創建:可以通過pd.Series()方法將列表或數組轉換成Series對象,例如:

import pandas as pd
data = [1, 2, 3, 4, 5]
s = pd.Series(data)
print(s)

# 輸出結果為:
# 0    1
# 1    2
# 2    3
# 3    4
# 4    5
# dtype: int64

2.通過字典創建:可以通過pd.Series()方法將字典轉換成Series對象,例如:

import pandas as pd
data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
s = pd.Series(data)
print(s)

# 輸出結果為:
# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64

如何創建DataFrame

1.通過列表或數組創建:可以通過pd.DataFrame()方法將列表或數組轉換成DataFrame對象,例如:

import pandas as pd
data = {'name': ['Tom', 'John', 'Mary', 'Lisa', 'Bob'], 'age': [28, 25, 23, 24, 27], 'score': [89, 78, 88, 95, 85]}
df = pd.DataFrame(data)
print(df)

# 輸出結果為:
#    name  age  score
# 0   Tom   28     89
# 1  John   25     78
# 2  Mary   23     88
# 3  Lisa   24     95
# 4   Bob   27     85

2.通過字典創建:可以通過pd.DataFrame()方法將字典轉換成DataFrame對象,例如:

import pandas as pd
data = {'name': ['Tom', 'John', 'Mary', 'Lisa', 'Bob'], 'age': [28, 25, 23, 24, 27], 'score': [89, 78, 88, 95, 85]}
df = pd.DataFrame(data, index=['one', 'two', 'three', 'four', 'five'])
print(df)

# 輸出結果為:
#        name  age  score
# one     Tom   28     89
# two    John   25     78
# three  Mary   23     88
# four   Lisa   24     95
# five    Bob   27     85

3.通過從文件中讀取數據創建:可以通過pd.read_方法()將本地存儲的文件導入DataFrame對象,例如:

import pandas as pd
df = pd.read_csv('data.csv')
print(df)

# 輸出結果為:
#     name  age  score
# 0    Tom   28     89
# 1   John   25     78
# 2   Mary   23     88
# 3   Lisa   24     95
# 4    Bob   27     85

 

如何對DataFrame進行分組?

Pandas庫中的DataFrame可以按照一個或多個列的值對數據集進行分組。分組後的數據集可以進行多種操作,如計算平均值、總和等。

下麵是對DataFrame進行分組的基本步驟:

  1. 導入Pandas庫
  2. 創建DataFrame, 例如,創建一個簡單的DataFrame,包含姓名、性別和年齡:
  3. 對DataFrame進行分組,可以按照一個或多個列的值對DataFrame進行分組
  4. 對分組後的數據集進行操作,可以對分組後的數據集進行各種計算,如計算平均值和總和。
import pandas as pd

# 創建DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Ella', 'Frank'],
        'Gender': ['F', 'M', 'M', 'M', 'F', 'M'],
        'Age': [25, 34, 42, 19, 31, 28]}
df = pd.DataFrame(data)

# 對DataFrame進行分組
grouped = df.groupby(['Gender', 'Age'])

# 計算每個性別和年齡段的總和
print(grouped.sum())

如何對DataFrame進行聚合操作?

對於DataFrame進行聚合,可以使用groupby()方法將數據按照指定的列進行分組,然後再對分組後的數據進行統計、計算等操作。

具體步驟如下:

  1. 使用groupby()方法對數據進行分組,可以按照單列或多列進行分組

  2. 對分組後的數據進行統計、計算等操作,可以使用常見的聚合函數,比如sum()、mean()、max()、min()、count()等

  3. 對聚合後的數據進行重命名、排序等處理,最後得到需要的聚合結果

import pandas as pd

# 創建示例數據
data = {'category': ['A', 'A', 'B', 'B', 'B', 'C', 'C'],
        'value': [1, 2, 3, 4, 5, 6, 7]}
df = pd.DataFrame(data)

# 按照category列進行分組,計算value列的和、平均值和數量
result = df.groupby('category').agg({'value': ['sum', 'mean', 'count']})

# 對聚合結果進行重命名和排序
result.columns = ['total_value', 'mean_value', 'count']
result.sort_values('total_value', ascending=False, inplace=True)

print(result)

如何對DataFrame進行合併操作?

對DataFrame進行合併操作,可以使用merge()方法,將兩個DataFrame按照指定的列進行連接,類似於SQL中的Join操作。如果兩個DataFrame的列名相同,則可以使用on參數指定連接的列,如果列名不同,則需要使用left_on和right_on參數指定連接的列。

具體步驟如下:

  1. 使用merge()方法將兩個DataFrame按照指定列進行連接

  2. 可以選擇不同的連接方式,包括inner、outer、left、right等

  3. 對連接後的數據進行排序、去重、重命名等處理,最終得到需要的結果

import pandas as pd

# 創建示例數據1
data1 = {'id': [1, 2, 3, 4, 5],
        'name': ['Tom', 'Jerry', 'Lucy', 'Lily', 'Jim'],
        'age': [20, 22, 25, 23, 26]}
df1 = pd.DataFrame(data1)

# 創建示例數據2
data2 = {'id': [1, 2, 3, 6, 7],
        'salary': [2000, 2200, 2500, 2300, 2600],
        'gender': ['M', 'F', 'F', 'F', 'M']}
df2 = pd.DataFrame(data2)

# 按照id列進行左連接
result = pd.merge(df1, df2, on='id', how='left')

# 對連接後的數據進行去重、排序、重命名
result.drop_duplicates('id', inplace=True)
result.sort_values('id', inplace=True)
result.rename(columns={'name': 'user_name', 'salary': 'user_salary'}, inplace=True)

print(result)

如何對DataFrame進行重塑操作?

對DataFrame進行重塑操作,包括轉置、堆疊和反堆疊等。轉置是將DataFrame的行與列互換,堆疊是將多個列進行合併為一列,反堆疊則是將一列拆分為多個列。

具體步驟如下:

  1. 對DataFrame進行轉置,可以使用T屬性或transpose()方法實現。

  2. 對DataFrame進行堆疊操作,可以使用stack()方法實現,堆疊時需要指定堆疊的列或行。

  3. 對DataFrame進行反堆疊操作,可以使用unstack()方法實現,反堆疊時需要指定反堆疊的列或行。

import pandas as pd

# 創建示例數據
data = {'name': ['Tom', 'Jerry', 'Lucy'],
        'math': [90, 80, 70],
        'english': [85, 78, 95],
        'science': [88, 92, 85]}
df = pd.DataFrame(data)

# 轉置DataFrame
result1 = df.T

# 堆疊DataFrame
result2 = df.set_index('name').stack().reset_index()

# 反堆疊DataFrame
result3 = df.set_index('name').unstack().reset_index()

print(result1)
print(result2)
print(result3)

如何對DataFrame進行透視表操作?

對DataFrame進行透視表操作,可以使用pivot_table()方法進行,透視表可以根據行、列和值進行數據彙總和計算,並展示出彙總計算後的結果。

具體步驟如下:

  1. 使用pivot_table()方法對DataFrame進行透視操作,需要指定行、列和值參數,並選擇需要的聚合函數進行計算。

  2. 可以對透視表進行去重、排序和重命名等處理後,得到需要的結果。

import pandas as pd

# 創建示例數據
data = {'name': ['Tom', 'Jerry', 'Lucy', 'Lily', 'Jim', 'Bob', 'Alice'],
        'gender': ['M', 'F', 'F', 'F', 'M', 'M', 'F'],
        'age': [20, 22, 25, 23, 26, 21, 30],
        'category': ['A', 'A', 'B', 'B', 'B', 'C', 'C'],
        'salary': [2000, 2200, 2500, 2300, 2600, 2800, 2900]}
df = pd.DataFrame(data)

# 對數據進行透視表操作,分別統計每種category、gender和age_range下salary的平均值和數量
result = pd.pivot_table(df, index=['category', 'gender'], columns=pd.cut(df['age'], [20, 25, 30]), values=['salary'],
                        aggfunc={'salary': ['mean', 'count']}, fill_value=0)

# 對透視表進行去重、排序、重命名等處理
result = result.stack(level=[0, 1])
result.columns = ['_'.join(col).strip() for col in result.columns.values]
result.reset_index(inplace=True)
result.sort_values(['category', 'gender', 'age'], inplace=True)

print(result)

如何處理重覆值?

Pandas庫中提供了一些方法來處理重覆值,包括檢測和刪除重覆值。

檢測重覆值:

Pandas庫中提供了duplicated()方法用來檢測重覆值,返回一個布爾類型的Series,表示每一行是否為重覆行。

drop_duplicates()方法則是用來刪除重覆行,返回一個新的DataFrame,移除重覆行之後的版本。

import pandas as pd


# 創建一個包含重覆行的DataFrame

df = pd.DataFrame({'col1': [1, 2, 3, 4, 4, 5],
'col2': ['A', 'B', 'C', 'D', 'D', 'E']})
print(df)


# 檢測重覆行

print(df.duplicated())


# 刪除重覆行

df_clean = df.drop_duplicates()
print(df_clean)

 如何處理異常值?

import pandas as pd
import numpy as np


# 創建一個包含異常值的Series

s = pd.Series([1, 2, 3, 4, 5, 100])
print(s)


# 使用Z-score方法檢測異常值

zscore_threshold = 3 # 設置閾值為3
mean = s.mean()
std = s.std()
zscore = (s - mean) / std
print(zscore.abs() > zscore_threshold)


# 使用IQR方法檢測異常值

q1 = s.quantile(0.25)
q3 = s.quantile(0.75)
iqr = q3 - q1
iqr_threshold = 1.5 # 設置閾值為1.5
print((s < q1 - iqr_threshold * iqr) | (s > q3 + iqr_threshold * iqr))


# 使用fillna()方法替換異常值

s_clean = s.copy()
s_clean[s_clean > 10] = np.nan # 設置異常值,將大於10的值設置為缺失值
s_clean = s_clean.fillna(s_clean.median()) # 使用中位數來填充缺失值
print(s_clean)


# 使用replace()方法替換異常值

s_clean = s.replace(100, s.median()) # 將100替換為中位數
print(s_clean)

如何處理離群值?

Pandas庫中提供了一些方法來處理離群值(Outlier),包括檢測和替換離群值。

檢測離群值: Pandas庫中提供了一些方法來檢測離群值,比如基於數據的分佈和規模,使用Z-score或IQR兩種方法進行離群值的檢測,並返回一個布爾類型的Series,表示每一行是否為離群值。

  • Z-score方法將每個值轉換成其到平均值的標準偏差的距離,超過給定閾值的值被視為離群值。
  • IQR方法則是基於四分位數,將數據劃分成四個部分,其中50%的數據落在中間,將中間部分的極端數據看做離群值。

替換離群值: 處理離群值時,我們可以使用fillna()方法或replace()方法來替換離群值。

  • fillna()方法可以使用mean、median、mode等方法替換缺失值,也可以使用給定的常數或者使用前一個或後一個非缺失值填充。
  • replace()方法可以使用常數或者使用給定的字典或函數替換特定的值。
import pandas as pd
import numpy as np


# 創建一個包含離群值的Series

s = pd.Series([1, 2, 3, 4, 5, 100])
print(s)


# 使用Z-score方法檢測離群值

zscore_threshold = 3 # 設置閾值為3
mean = s.mean()
std = s.std()
zscore = (s - mean) / std
print(zscore.abs() > zscore_threshold)


# 使用IQR方法檢測離群值

q1 = s.quantile(0.25)
q3 = s.quantile(0.75)
iqr = q3 - q1
iqr_threshold = 1.5 # 設置閾值為1.5
print((s < q1 - iqr_threshold * iqr) | (s > q3 + iqr_threshold * iqr))


# 使用fillna()方法替換離群值

s_clean = s.copy()
s_clean[s_clean > 10] = np.nan # 將大於10的值設置為缺失值
s_clean = s_clean.fillna(s_clean.median()) # 使用中位數來填充缺失值
print(s_clean)


# 使用replace()方法替換離群值

s_clean = s.clip(0, 10) # 將大於10的值和小於0的值都設置為10和0
print(s_clean)

如何進行數據類型轉換?

在Pandas庫中,我們需要對文件讀入的數據進行處理和轉換後,才能在之後的分析中有效地使用。數據類型轉換是數據預處理中最基本的操作之一,數據類型的轉換能夠將原有數據的類型轉變為用戶需要的類型,包括將字元串轉換為數字、將數字轉換為日期、將數值轉換為類別類型等,Pandas庫中提供了astype()方法來進行數據類型轉換。

astype()方法: Pandas庫中的astype()方法可以將一個或多個列的數據類型轉換為另一種類型。使用astype()方法,需要在括弧中指定要轉換數據類型的列名和數據類型。轉換數據類型後將返回一個新的DataFrame,原數據不發生改變。

import pandas as pd


# 創建一個包含數字和字元串的DataFrame

df = pd.DataFrame({'col1': [1, 2, 3],
'col2': ['4', '5', '6']})
print(df.dtypes)


# 轉換數據類型

df['col2'] = df['col2'].astype(int)
print(df.dtypes)

 

在黑夜裡夢想著光,心中覆蓋悲傷,在悲傷里忍受孤獨,空守一絲溫暖。 我的淚水是無底深海,對你的愛已無言,相信無盡的力量,那是真愛永在。 我的信仰是無底深海,澎湃著心中火焰,燃燒無盡的力量,那是忠誠永在。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # todo 列表 - [ ] clang-format - [ ] c++ 整合 # 軟體安裝 略 # 基本的環境搭建 ## 最基本的 vscode 插件 只需要安裝如下兩個插件即可 c/c++ 擴展是為了最基本的代碼提示和調試支持 cmake language support 是為了提示 CMa ...
  • [系列文章目錄和關於我](https://www.cnblogs.com/cuzzz/p/16609728.html) ## 零丶背景 最近有很多想學的,像netty的使用、原理源碼,但是苦於自己對於操作系統和nio瞭解不多,有點無從下手,遂學習之。 ## 一丶網路io的過程 ![image-202 ...
  • 如果某個派生自 QObject 的類重寫 eventFilter 方法,那它就成了事件過濾器(Event Filter)。該方法的聲明如下: virtual bool eventFilter(QObject *watched, QEvent *event); watched 參數是監聽事件的對象,即 ...
  • # Go 連接 MySQL之 MySQL 預處理 ## 一、ChatGPT 關於 MySQL 預處理 的回答 ### 問:什麼是MySQL 的預處理 具體執行過程時什麼 #### ChatGPT 答: MySQL的預處理是一種在執行SQL語句之前,先進行編譯和優化的機制。它將SQL語句分成兩個階段: ...
  • ## UDP 簡介 UDP(User Datagram Protocol,用戶數據報協議)是傳輸層的另一種協議,比 TCP 具有更快的傳輸速度,但是不可靠。UDP 發送的數據單元被稱為 UDP 數據報,當網路傳輸 UDP 數據報時,無法保證數據報一定到達目的地,也無法保證各個數據報按發送的順序到達目 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • title: "Go 語言連接資料庫實現增刪改查" date: 2023-06-10T18:55:16+08:00 draft: true tags: ["Go"] categories: ["Go"] # Go 連接 MySQL實現增刪改查 ## 一、初始化連接 ### 創建項目 ![](http ...
  • 一、Maven常用命令及其作用 Maven的生命周期包括:clean、validate、compile、test、package、verify、install、site、deploy,其中需要註意的是:執行後面的命令時,前面的命令自動得到執行,(其中,也可以跳過其中的步驟,如:test,在mvn i ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...