數據分析——Pandas庫

Pandas是Python生態系統中最強大、最流行的數據分析庫,專為處理結構化數據(如表格和時間序列)而設計。它提供了高效的數據結構和豐富的功能,使得數據清洗、轉換、分析和可視化變得簡單直觀。

一、Pandas庫的安裝詳解

1. 安裝前的準備

在安裝Pandas之前,建議先確保已安裝Python環境(建議Python 3.6及以上版本)。可以通過以下命令檢查Python版本:

python --version

python3 --version

2. 安裝方法

方法一:使用pip安裝(推薦)

這是最簡單直接的安裝方式:

pip install pandas

如果需要安裝特定版本:

pip install pandas==1.3.5#本篇所用版本

方法二:使用conda安裝(適合Anaconda用戶)

conda install pandas

方法三:源碼安裝(適合開發者)

git clone https://github.com/pandas-dev/pandas.git
cd pandas
python setup.py install

3. 驗證安裝

安裝完成后,可以通過以下方式驗證:

import pandas as pd
print(pd.__version__)

4. 常見問題解決

安裝速度慢

可以更換國內的鏡像源:

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

二、pandas的數據結構

pandas 主要提供了兩種核心數據結構:

  1. Series(一維數組)

    • 類似于帶標簽的一維數組
    • 由兩個數組組成:一個存儲數據,一個存儲索引(默認從0開始)
    • 示例:
      import pandas as pd
      s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
      
    • 特性:
      • 支持向量化操作
      • 可以存儲任意數據類型
      • 索引可以重復
  2. DataFrame(二維表格)

    • 類似于電子表格或SQL表
    • 由多個Series組成的字典結構
    • 示例:
      data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]}
      df = pd.DataFrame(data)
      
    • 特性:
      • 行索引(index)和列索引(columns)
      • 支持列的不同數據類型
      • 提供豐富的數據操作方法

適用場景??

??Series??

??DataFrame??

  • ??單變量分析??:如時間序列數據(股價、溫度記錄)。

  • ??簡單統計??:計算均值、最大值等基礎統計量。

  • ??作為DataFrame組件??:DataFrame的列本質上是Series。

  • ??結構化數據分析??:如CSV文件、SQL表、Excel表格。

  • ??復雜操作??:數據清洗(去重、填充缺失值)、分組聚合(groupby)、透視表。

  • ??機器學習??:特征工程、數據預處理(如標準化、編碼)。

這些數據結構為數據分析提供了強大的基礎,支持從數據讀取、清洗到分析的全流程操作。

三、pandas數據讀取與寫入

讀取數據

pandas提供了多種方法來讀取不同格式的數據文件:

1. 讀取CSV文件

import pandas as pd# 基本讀取
df = pd.read_csv('data.csv')# 帶參數讀取
df = pd.read_csv('data.csv', encoding='utf-8',header=0,  # 指定表頭行index_col=0,  # 指定索引列na_values=['NA', 'N/A'])  # 指定缺失值標識

2. 讀取Excel文件

# 讀取單個sheet
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')# 讀取整個Excel文件的所有sheet
excel_file = pd.ExcelFile('data.xlsx')
df1 = excel_file.parse('Sheet1')
df2 = excel_file.parse('Sheet2')

3. 讀取JSON文件

df = pd.read_json('data.json', orient='records')

4. 讀取SQL數據庫

from sqlalchemy import create_engine# 創建數據庫連接
engine = create_engine('sqlite:///database.db')# 讀取數據
df = pd.read_sql('SELECT * FROM table_name', con=engine)

寫入數據

pandas同樣支持多種數據格式的輸出:

1. 寫入CSV文件

df.to_csv('output.csv',index=False,  # 不寫入索引encoding='utf-8',columns=['col1', 'col2'])  # 指定寫入的列

2. 寫入Excel文件

# 寫入單個sheet
df.to_excel('output.xlsx', sheet_name='Data')# 寫入多個sheet
with pd.ExcelWriter('output.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1')df2.to_excel(writer, sheet_name='Sheet2')

3. 寫入JSON文件

df.to_json('output.json', orient='records')

4. 寫入SQL數據庫

# 寫入新表
df.to_sql('new_table', con=engine, if_exists='fail')# 追加到現有表
df.to_sql('existing_table', con=engine, if_exists='append')

其他實用功能

1. 處理大文件

對于大文件可以使用分塊讀取:

chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)for chunk in chunks:# 處理每個數據塊process(chunk)

2. 數據類型指定

dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('data.csv', dtype=dtypes)

3. 日期解析

df = pd.read_csv('data.csv', parse_dates=['date_column'])

四、pandas數據查看與檢查

head()和tail()方法

  • df.head(n):查看DataFrame的前n行,默認顯示前5行
    df.head(10)  # 查看前10行數據
    
  • df.tail(n):查看DataFrame的后n行,默認顯示后5行
    df.tail(3)  # 查看最后3行數據
    

數據概覽

  • df.shape:查看DataFrame的形狀(行數,列數)
    print(df.shape)  # 輸出類似(1000, 15)表示1000行15列
    
  • df.info():查看數據集的整體信息
    • 顯示每列的非空值數量
    • 每列的數據類型
    • 內存使用情況
    df.info()  # 輸出各列詳細信息
    

數據統計信息檢查

describe()方法

  • df.describe():生成描述性統計信息
    • 數值型列:計數、均值、標準差、最小值、四分位數、最大值
    • 非數值型列:計數、唯一值數量、頻數最高的值及其出現次數
    df.describe(include='all')  # 包含所有列
    df.describe(include=['float64'])  # 只包含浮點數列
    

唯一值和頻率統計

  • df.nunique():查看每列的唯一值數量
    df.nunique()  # 各列唯一值數量
    
  • df.value_counts():查看某列的值分布
    df['gender'].value_counts(normalize=True)  # 顯示比例而非計數
    

數據類型和缺失值檢查

數據類型檢查

  • df.dtypes:查看各列的數據類型
    print(df.dtypes)  # 輸出各列數據類型
    
  • 類型轉換示例:
    df['date'] = pd.to_datetime(df['date'])  # 轉換為日期類型
    df['price'] = df['price'].astype(float)  # 轉換為浮點數
    

缺失值檢查

  • df.isnull():返回布爾矩陣,顯示每個元素是否為缺失值
    df.isnull().sum()  # 統計每列缺失值數量
    
  • 缺失值可視化:
    import matplotlib.pyplot as plt
    import seaborn as snssns.heatmap(df.isnull(), cbar=False)
    plt.show()
    

更高級的數據檢查方法

數據抽樣

  • df.sample():隨機抽樣查看數據
    df.sample(5)  # 隨機查看5行
    df.sample(frac=0.1)  # 抽取10%的數據
    

條件篩選檢查

  • 使用布爾索引篩選特定數據
    # 查看年齡大于30的記錄
    df[df['age'] > 30]# 查看特定城市和性別的記錄
    df[(df['city'] == 'Beijing') & (df['gender'] == 'Female')]
    

重復值檢查

  • df.duplicated():檢查重復行
    df.duplicated().sum()  # 統計重復行數
    df[df.duplicated()]  # 查看重復行
    
  • 特定列重復檢查:
    df.duplicated(subset=['id', 'date']).sum()  # 檢查ID和日期組合是否重復
    

五、pandas數據選擇與過濾

1. 列選擇
列選擇是最基礎的數據操作之一,通過列名來獲取指定列的數據。

單列選擇

df['Name']  # 返回Name列的所有數據,返回類型為Series

多列選擇

df[['Name', 'Age']]  # 返回包含Name和Age兩列的數據,返回類型為DataFrame

應用場景:當只需要分析特定幾列數據時使用,例如只需要查看客戶的姓名和年齡信息。

2. 行選擇

行選擇可以通過標簽或位置索引來獲取數據。

按標簽選擇行(loc)

df.loc[0]        # 返回索引標簽為0的行數據
df.loc[0:2]      # 返回索引標簽從0到2的行數據(包含2)

按位置選擇行(iloc)

df.iloc[0]       # 返回第一行數據(位置索引從0開始)
df.iloc[0:3]     # 返回第1到第3行數據(不包含3)

注意事項

  • loc是基于標簽的索引,包含結束位置
  • iloc是基于位置的索引,不包含結束位置

3. 條件過濾

pandas 提供了強大的布爾索引(Boolean Indexing)功能,可以根據條件表達式篩選 DataFrame 或 Series 中的數據。這種過濾方式非常靈活高效,是數據清洗和預處理中的常用操作。

test = pd.DataFrame({1:[1,2,3],2:[4,5,6],3:[7,8,9],4:[10,11,12],5:[13,14,15]})
print(test[[True,False,False]])#輸出布爾值為Ture的行。結果為1,4,7,10,13

簡單條件過濾

df[df['Age'] > 30]  # 篩選出年齡大于30歲的所有記錄

多條件組合過濾

df[(df['Age'] > 25) & (df['City'] == 'NY')]  # 篩選年齡大于25歲且居住在NY的記錄

示例說明:假設我們有一個客戶數據集,包含Name、Age、City等字段。使用多條件過濾可以快速找到特定城市的特定年齡段客戶。

運算符說明

  • & 表示邏輯與
  • | 表示邏輯或
  • ~ 表示邏輯非

注意:多個條件必須用括號括起來,否則會報錯。

六、數據處理

1. 缺失值處理

缺失值是數據分析中常見的問題,pandas提供了多種處理方式:

刪除缺失值

df.dropna()  # 默認刪除包含任何缺失值的整行
df.dropna(axis=1)  # 刪除包含缺失值的列
df.dropna(thresh=3)  # 只保留至少有3個非缺失值的行

填充缺失值

df.fillna(0)  # 用0填充所有缺失值
df.fillna({'Salary': df['Salary'].mean(), 'Age': 30})  # 對不同列使用不同填充值
df.fillna(method='ffill')  # 用前一個有效值向前填充

缺失值檢測

df.isnull()  # 返回布爾DataFrame,顯示每個位置是否為缺失值
df.isnull().sum()  # 計算每列的缺失值數量
df[df['Age'].isnull()]  # 篩選出Age列為缺失值的行

2. 重復值處理

重復數據會影響分析結果,常見的處理方法包括:

df.drop_duplicates()  # 刪除完全相同的行
df.drop_duplicates(subset=['Name', 'Phone'])  # 基于指定列判斷重復
df.drop_duplicates(keep='last')  # 保留最后一次出現的重復行
df.drop_duplicates(keep=False)  # 刪除所有重復行

3. 數據排序

數據排序有助于發現模式和異常值:

df.sort_values('Age')  # 按年齡升序排序
df.sort_values('Age', ascending=False)  # 按年齡降序排序
df.sort_values(['Department', 'Salary'], ascending=[True, False])  # 多列排序
df.sort_index()  # 按索引排序

4. 數據分組

分組是數據分析的核心操作,可用于計算各種統計量:

# 基本分組
df.groupby('City')['Age'].mean()  # 按城市分組計算平均年齡# 多重分組
df.groupby(['City', 'Gender'])['Income'].median()  # 按城市和性別分組計算收入中位數# 多聚合函數
df.groupby('Department').agg({'Salary': ['mean', 'max', 'min'],'Age': 'median'
})# 分組后應用自定義函數
def top_earners(group):return group.nlargest(3, 'Salary')df.groupby('Department').apply(top_earners)

    七、數據轉換

    1.添加新列 通過布爾條件創建新列是數據預處理中的常見操作:

    df['Senior'] = df['Age'] > 30  # 添加布爾列,標記年齡大于30歲的員工
    

    示例應用場景:在人力資源數據分析中,可以用此方法快速區分資深員工和普通員工,便于后續分組分析。

    2.應用函數 使用apply方法可以對列數據進行函數處理:

    df['Name_Length'] = df['Name'].apply(len)  # 計算每個姓名的字符長度
    df['Salary_Adjusted'] = df['Salary'].apply(lambda x: x*1.1)  # 工資上調10%
    

    最佳實踐:當需要執行復雜轉換時,可以定義單獨的函數然后傳入apply,提高代碼可讀性3

    3.數據合并 Pandas提供多種數據合并方式: 縱向合并(堆疊):

    pd.concat([df1, df2], axis=0)  # 默認縱向合并,相同結構的兩個表格上下拼接
    pd.concat([df1, df2], ignore_index=True)  # 重建索引
    

    橫向合并(連接):

    # 內連接,基于共同鍵值合并
    pd.merge(df1, df2, on='employee_id', how='inner')# 左連接,保留左邊表的所有記錄
    pd.merge(df1, df2, on='department', how='left')# 外連接,保留所有記錄
    pd.merge(df1, df2, on='project_id', how='outer')
    

    合并操作常用于:將分散在不同表中的相關數據整合到一起,比如將員工信息表與部門信息表合并。

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

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

    相關文章

    數據結構-哈希表(散列表)

    1.基本概念哈希表(散列表):提高數據的查找效率哈希存儲:將要存儲的數據的關鍵字和存儲位置之間,建立起對應的關系, 這個關系稱之為哈希函數。存儲數據時,通過對應的哈希函數可以將數據映射到指定…

    如何在Vue中使用拓撲圖功能

    前言 該組件基于 Vue.js 和 AntV G6 構建項目特色功能 1. 豐富的節點圖標支持 本拓撲圖系統的最大特色是支持使用自定義圖片作為節點圖標 2. 智能的力導向布局 系統采用力導向布局算法,能夠自動優化節點位置,避免重疊,形成美觀的網絡拓撲結構…

    基于dynamic的Druid 與 HikariCP 連接池集成配置區別

    你提供的內容是關于 ??dynamic-datasource-spring-boot-starter?? 的詳細介紹,這是一個非常實用的 ??Spring Boot 多數據源動態切換組件??,適用于需要在單個應用中連接多個數據庫并靈活切換數據源的場景。下面我為你梳理一下該組件的核心信息與使…

    算法訓練之棧

    ???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ??????個人…

    OpenAI 最新開源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署詳細教程

    OpenAI 最近發布了其首個開源的開放權重模型gpt-oss,這在AI圈引起了巨大的轟動。對于廣大開發者和AI愛好者來說,這意味著我們終于可以在自己的機器上,完全本地化地運行和探索這款強大的模型了。 本教程將一步一步指導你如何在Windows系統上&…

    在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴)

    在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴) 在Linux系統中,有時候我們需要在特定的環境或架構下安裝軟件包,而不影響主系統。一種常見的方法是創建一個虛擬的根目錄,并在此環境中操作。本文將介紹如何通過創建…

    scratch筆記和練習-第9課:一起來繪畫

    位圖也稱為點陣圖,它是由許許多多的點組成的,這些點被稱為像素。位圖圖像可以表現豐富的多彩變化 并產生逼真的效果,很容易在不同軟件之間交換使用, 但它在保存圖像時需要記錄每一個像素的色彩信息,所以占用的存儲空間…

    [linux] Linux:一條指令更新DDNS

    Linux:一條指令更新DDNS 在動態IP環境下,如何確保我們的域名始終指向正確的公網IP地址?動態DNS(DDNS)服務為我們提供了完美的解決方案。今天,我將分享一個簡潔高效的Linux命令行指令,用于自動更…

    [激光原理與應用-182]:測量儀器 - 光束型 - 光束質量分析儀

    光束質量分析儀是用于精確評估激光光束特性的核心設備,通過測量光束的強度分布、相位分布、發散角等參數,為激光系統的優化、加工工藝控制及科研實驗提供關鍵數據支持。以下是光束質量分析儀的詳細解析:一、核心功能 - 光束強度分布分析測量內…

    Linux 限制 root 登錄 IP 地址的方法

    Linux 限制 root 登錄 IP 地址的方法Linux 限制 root 登錄 IP 地址的方法方法一:修改 SSH 配置文件方法二:使用 hosts.allow 和 hosts.deny 文件方法三:使用防火墻規則方法四:使用 access.conf 文件注意事項Linux 限制 root 登錄 …

    Word中怎樣插入特殊符號

    使用 “插入” 菜單:插入常用符號:將光標置于要插入符號的位置,點擊 “插入” 選項卡,在 “符號” 組中點擊 “符號” 按鈕,會彈出一個符號庫,里面包含了常見的標點符號、特殊字符等,找到所需符…

    Linux 內核發包流程與路由控制實戰

    Linux 內核發包流程與路由控制實戰 在網絡調優、性能優化、SDN、NFV、容器網絡等場景下,理解 Linux 內核發包路徑和路由控制機制是必修課。 本文將從內核網絡棧的原理入手,再結合 iproute2 命令和 策略路由給出實戰案例。一、Linux 內核發包流程&#xf…

    點播服務器

    早期的時候,用 live555 作為 rtsp 點播服務器;現在比較常用的 流媒體服務器比較多;這里比較簡單的,可以用 ZLMediakit;可以支持 ffmeg 退流 到ZLMediakit,然后別的客戶端從 ZLMediakit 服務器拉流&#xff…

    分享超圖提供的、很不錯的WebGIS學習資源

    最近在學習了解Supermap iclient,發現官方提供的幫助文檔、GIS學堂真的不錯,解釋了很多的內容。 官方modern-web-gis-in-action文檔的網址如下:https://iclient.supermap.io/web/books/modern-web-gis-in-action/,在其中介紹了現代…

    通信算法之298: verilog語法generate和for介紹

    在 Verilog 中,generate和for是實現參數化設計和模塊實例化復用的重要工具,尤其在需要根據參數動態生成邏輯時非常有用。以下是它們的使用方法和區別:1. for循環(過程塊內)for循環主要用于過程塊(always/in…

    laravel在cli模式下輸出格式漂亮一些

    在 Laravel 的 CLI 模式下,可以通過以下方式讓命令行輸出更加美觀和專業: 1. 使用 Artisan 輸出助手方法 Laravel 提供了多種輸出樣式方法: public function handle() {// 基礎樣式$this->info(成功信息 - 綠色); // 綠色$this->err…

    大數據管理與應用學什么?就業前景怎么樣?

    前言在數字經濟蓬勃發展的今天,大數據已經成為推動社會進步的核心生產要素。大數據管理與應用作為新興交叉學科,正受到越來越多學生和企業的關注。本文將全面剖析該專業的課程體系、核心技能要求,詳細介紹CDA數據分析師認證的備考策略&#x…

    mac筆記本如何重新設置ssh key

    要在Mac上重新生成SSH密鑰并將其添加到平臺,可以按照以下步驟操作: 打開終端 在Mac上,你可以通過Spotlight搜索(按Command Space)輸入Terminal來打開終端或者直接搜索終端檢查現有SSH密鑰 首先,檢查是否已…

    Godot ------ 通過鼠標對節點進行操作

    Godot ------ 通過鼠標對節點進行操作 引言 正文 引言 對于一個游戲,通過鼠標對游戲對象進行操作是非常普遍的行為,本文我們將以 Control 節點進行舉例,說明如何通過鼠標對 Control 節點進行移動操作。 正文 首先,我們創建一個 Contorl 節點,并將它的 Layout->Trans…

    k8s 網絡插件 flannel calico

    一、k8s 網絡概述 Kubernetes網絡是指在Kubernetes集群中不同組件之間進行通信和交互的網絡架構,每個容器都有自己的IP地址,這些容器組成了Pod,Pod是Kubernetes調度的最小單元。 Pod是Kubernetes中最小的部署單元,每個Pod都有一個…