Python編程進階知識之第四課處理數據(pandas)

目錄

簡介

1. 安裝 Pandas

2.基本數據結構

1.Series

(1.)創建Series

?(2.)Series的屬性

?(3.)Series 的索引和切片

2.DataFrame

(1.)創建 DataFrame

?(2.)DataFrame 的屬性

? (3.)DataFrame 的排序和值替換

?3.pandas的選取與修改

4.pandas的索引

1.?標簽索引(.loc)

2.?位置索引(.iloc)

5.?Pandas 的條件篩選?

6. Pandas 中處理重復值

7.?Pandas 中處理缺失值


簡介

????????在當今這個數據爆炸的時代,數據處理已經成為了各個領域中不可或缺的一環。無論是數據分析、機器學習還是人工智能,都需要對大量的數據進行清洗、轉換和分析。而 Pandas 作為 Python 中最流行的數據處理庫之一,憑借其強大的功能和簡潔的 API,成為了數據科學家們的首選工具。無論你是數據科學的新手還是有一定經驗的從業者,都能從本文中獲得有價值的信息。

????????這篇文章并沒有把pandas所有內容說完,但是為后面機器學習、深度學習已經足夠使用了,學習太多容易混亂

1. 安裝 Pandas

????????Pandas 是一個開源的 Python 庫,專為數據處理和分析而設計。它提供了高性能、易用的數據結構和數據分析工具,使數據處理變得更加簡單和高效。Pandas 的主要數據結構是 Series(一維數組)和 DataFrame(二維表格),它們提供了強大的索引功能和數據操作能力。

????????安裝 Pandas 非常簡單,只需要使用 pip 命令即可:

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

2.基本數據結構

????????Pandas 有兩種主要的數據結構:Series 和 DataFrame。

1.Series

(1.)創建Series

????????Series 是一個一維的帶標簽數組,可以容納任何數據類型(整數、字符串、浮點數、Python 對象等)。它由兩部分組成:索引(index)和值(values)。

import pandas as pd# 創建一個Series
s_1 = pd.Series([1, 2, 3, 4, 5])
print(s_1)# 創建自定義索引的 Series
s_2 = pd.Series([1, 2, 3, 4, 5],index=['a', 'b', 'c', 'd', 'e'])
print(s_2)#創建字符串類型的 Series
s_3 = pd.Series(['Lily', "Rose", "Jack"])
print(s_3)

輸出結果:

#s_1
0    1
1    2
2    3
3    4
4    5
dtype: int64
#s_2
a    1
b    2
c    3
d    4
e    5
dtype: int64
#s_3
0    Lily
1    Rose
2    Jack
dtype: object

?(2.)Series的屬性

  • .index:獲取索引對象
  • .values:獲取底層 NumPy 數組
print(s_1.index)
print(s_2.index)
print(s_1.values)
print(s_3.values)
# 運行結果:RangeIndex(start=0, stop=5, step=1)
# Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
# [1 2 3 4 5]
# ['Lily' 'Rose' 'Jack']

?(3.)Series 的索引和切片

創建 Series 對象

import pandas as pds_1 = pd.Series([1, 2, 3, 4, 5],index=['a', 'b', 'c', 'd', 'e'])s_2 = pd.Series(['lily', 'rose', 'jack'])
# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64# 0    lily
# 1    rose
# 2    jack
# dtype: object

基于標簽的索引(自定義索引)

# 訪問單個元素(標簽索引)
print(s_1['d'])  # 輸出:4# 訪問多個元素(標簽切片)
# print(s_1['a':'d'])  # 輸出:a到d的元素(含d)# 訪問不連續的元素
print(s_1[['a', 'd']])  # 輸出:a和d的元素

?基于位置的索引(默認索引)

print(s_2[2])       # 輸出:jack(位置2的元素)
print(s_2[0:2])     # 輸出:位置0和1的元素(不含2)
print(s_2[[0, 2]])  # 輸出:位置0和2的元素

?混合索引的注意事項

print(s_1[4])  # 輸出:5(位置4的元素,即索引'e'對應的值)
  • 當自定義索引是標簽時,s_1[4]會被解釋為位置索引
  • 但這種用法容易混淆,建議明確使用.loc(標簽)或.iloc(位置)

2.DataFrame

????????DataFrame 是一個二維的帶標簽數據結構,類似于 Excel 表格或 SQL 表。它可以被看作是由多個 Series 組成的字典,每個 Series 共享相同的索引。

(1.)創建 DataFrame

創建帶自定義索引的 DataFrame

df_1 = pd.DataFrame({'age': [10, 11, 12],'name': ['tim', 'tom', 'rose'],'income': [100, 200, 300]},index=['person1', 'person2', 'person3'])
print(df_1)
  • 使用字典創建 DataFrame,鍵為列名,值為列數據
  • 通過index參數指定行索引
          age  name  income
person1   10   tim    100
person2   11   tom    200
person3   12  rose    300

?創建帶默認索引的 DataFrame

df_1 = pd.DataFrame({'age': [10, 11, 12],'name': ['tim', 'tom', 'rose'],'income': [100, 200, 300]})
print(df_1)
  • 不指定索引時,默認生成整數索引(0 到 2)
   age  name  income
0   10   tim    100
1   11   tom    200
2   12  rose    300

?(2.)DataFrame 的屬性

# 行索引
df_1.index  # 輸出:Index(['person1', 'person2', 'person3'], dtype='object')# 列名
df_1.columns  # 輸出:Index(['age', 'name', 'income'], dtype='object')# 值(NumPy數組)
df_1.values  # 輸出:
# array([[10, 'tim', 100],
#        [11, 'tom', 200],
#        [12, 'rose', 300]], dtype=object)

訪問DataFrame 的列(Series)

print(df_1.name)
  • 通過屬性訪問name列,返回 Series 對象
  • 輸出結果:
0     tim
1     tom
2    rose
Name: name, dtype: object

? (3.)DataFrame 的排序和值替換

創建 DataFrame

dic = {'name': ['kiti', 'beta', 'peter', 'tom'],'age': [20, 18, 35, 21],'gender': ['f', 'f', 'm', 'm']}
df = pd.DataFrame(dic)
print(df)
  • 使用字典創建 DataFrame,默認索引為 0 到 3
   name  age gender
0  kiti   20      f
1  beta   18      f
2 peter   35      m
3   tom   21      m

按照年齡列排序

# 升序排序(默認)
df = df.sort_values(by=['age'])# 降序排序
df = df.sort_values(by=['age'], ascending=False)
  • 最終結果(降序):
   name  age gender
2 peter   35      m
3   tom   21      m
0  kiti   20      f
1  beta   18      f

值替換

df['gender'] = df['gender'].replace(['m', 'f'], ['male', 'female'])
  • replace()方法替換 Series 中的值
  • ['m', 'f']:要替換的值
  • ['male', 'female']:替換后的值
   name  age  gender
2 peter   35    male
3   tom   21    male
0  kiti   20  female
1  beta   18  female

?3.pandas的選取與修改

創建 DataFrame

df = pd.DataFrame({'age': [10, 11, 12],'name': ['tim', 'tom', 'rose'],'income': [100, 200, 300]},index=['person1', 'person2', 'person3'])
          age  name  income
person1   10   tim    100
person2   11   tom    200
person3   12  rose    300

?添加列

df['pay'] = [20, 30, 40]
  • 在末尾添加pay
          age  name  income  pay
person1   10   tim    100    20
person2   11   tom    200    30
person3   12  rose    300    40

?添加行

df.loc['person4', ['age', 'name', 'income']] = [20, 'kitty', 200]
  • 使用.locperson4位置添加新行
          age   name  income  pay
person1   10    tim    100    20
person2   11    tom    200    30
person3   12   rose    300    40
person4   20  kitty    200   NaN

?數據訪問

# 訪問列
print(df.name)        # 通過屬性訪問# 訪問多列
print(df[['age', 'name']])# 訪問行(位置切片)
print(df[0:2])        # 位置0到1(不含2)# 訪問行(標簽索引)
print(df.loc[['person1', 'person3']])# 訪問單個值
print(df.loc['person1', 'name'])  # 輸出:tim

?刪除操作

# 直接刪除列(原地操作)
del df['age']# 刪除列(返回新DataFrame)
data = df.drop('name', axis=1, inplace=False)# 刪除行(原地操作)
df.drop('person3', axis=0, inplace=True)

?時間序列 DataFrame

datas = pd.date_range('20180101', periods=5)
df1 = pd.DataFrame(np.arange(30).reshape(5, 6), index=datas, columns=['A', 'B', 'C', 'D', 'E', 'F'])
                   A   B   C   D   E   F
2018-01-01         0   1   2   3   4   5
2018-01-02         6   7   8   9  10  11
2018-01-03        12  13  14  15  16  17
2018-01-04        18  19  20  21  22  23
2018-01-05        24  25  26  27  28  29

4.pandas的索引

創建 DataFrame

df = pd.DataFrame(np.arange(30).reshape(5, 6),index=['20180101', '20180102', '20180103', '20180104', '20180105'],columns=['A', 'B', 'C', 'D', 'E', 'F']
)
  • 使用 NumPy 數組創建 DataFrame
  • 行索引為日期字符串,列索引為字母
            A   B   C   D   E   F
20180101    0   1   2   3   4   5
20180102    6   7   8   9  10  11
20180103   12  13  14  15  16  17
20180104   18  19  20  21  22  23
20180105   24  25  26  27  28  29

1.?標簽索引(.loc

# 獲取某列(全部行的B列)
print(df.loc[:, 'B'])
# 輸出:
# 20180101     1
# 20180102     7
# 20180103    13
# 20180104    19
# 20180105    25
# Name: B, dtype: int64# 獲取單個值(20180103行的B列)
print(df.loc['20180103', 'B'])  # 輸出:13# 獲取某行的多列(20180103行的B列和D列)
print(df.loc['20180103', ['B', 'D']])
# 輸出:
# B    13
# D    15
# Name: 20180103, dtype: int64# 獲取整行(20180101行的所有列)
print(df.loc['20180101', :])
# 輸出:
# A    0
# B    1
# C    2
# D    3
# E    4
# F    5
# Name: 20180101, dtype: int64

2.?位置索引(.iloc

# 獲取單個值(第2行第3列,索引從0開始)
print(df.iloc[1, 2])  # 輸出:8# 獲取某列(所有行的第3列)
print(df.iloc[:, 2])
# 輸出:
# 20180101     2
# 20180102     8
# 20180103    14
# 20180104    20
# 20180105    26
# Name: C, dtype: int64# 獲取整行(第2行的所有列)
print(df.iloc[1, :])
# 輸出:
# A     6
# B     7
# C     8
# D     9
# E    10
# F    11
# Name: 20180102, dtype: int64

5.?Pandas 的條件篩選?

讀取數據

df = pd.read_csv("data2.csv", encoding='gbk', engine='python')

?數值條件篩選

# 篩選好評數>17000的記錄
df_1 = df[df['好評數'] > 17000]# 篩選好評數在15000-17000之間的記錄
df_2 = df[df['好評數'].between(15000, 17000)]
  • df['好評數'] > 17000:生成布爾 Series
  • between(a, b):等效于(x >= a) & (x <= b)

?字符串條件篩選

# 篩選品牌包含"蘋果"且非空的記錄
df_3 = df[df['品牌'].str.contains('蘋果', na=False)]# 篩選品牌包含"蘋果"或為空值的記錄
df_4 = df[df['品牌'].str.contains('蘋果', na=True)]
  • str.contains('蘋果'):判斷字符串是否包含子串
  • na=False:將 NaN 視為 False(排除空值)
  • na=True:將 NaN 視為 True(包含空值)

?多條件組合篩選

# 篩選價格<7000且好評數>16000的記錄
df_5 = df[(df['價格'] < 7000) & (df['好評數'] > 16000)]# 篩選價格<6000或好評數>18000的記錄
df_6 = df[(df['價格'] < 6000) | (df['好評數'] > 18000)]
  • 使用&(邏輯與)和|(邏輯或)組合條件
  • 每個條件必須用括號()包裹
  • 最終結果df_6包含所有滿足任一條件的記錄

6. Pandas 中處理重復值

讀取數據

df = pd.read_csv(r"data1.csv", encoding='gbk', engine='python')

??????判斷重復值

# 判斷全量重復行(所有列值相同)
result1 = df.duplicated()# 判斷基于單列的重復行
result2 = df.duplicated('gender')# 判斷基于多列組合的重復行
result3 = df.duplicated(['gender', 'name'])
  • duplicated()返回布爾 Series,標記每行是否為重復行
  • keep='first'(默認):首次出現的行標記為 False,后續重復行標記為 True
  • 多列判斷時,只有所有指定列的值都相同才算重復

?提取重復行

a = df[result1]  # 全量重復行
b = df[result2]  # gender列重復的行
c = df[result3]  # gender和name都重復的行# 手動布爾索引(示例)
d = df[[True, False, False, True, True, False, False]]
  • 通過布爾索引提取對應行
  • 手動指定布爾列表時,長度必須與 DataFrame 行數一致

?刪除重復行

# 刪除全量重復行(保留首次出現的行)
new_df1 = df.drop_duplicates()# 刪除基于多列組合的重復行
new_df2 = df.drop_duplicates(['name', 'gender'])

7.?Pandas 中處理缺失值

讀取數據

df = pd.read_csv(r"data.csv", encoding='gbk', engine='python')

?

?檢測缺失值

na = df.isnull()
  • isnull()返回布爾 DataFrame
  • 每個元素標記是否為缺失值(NaNNone

?

    填充缺失值

    df1 = df.fillna('1')
    • fillna('1'):用字符串'1'填充所有缺失值
    • 其他常用填充方式:
    df.fillna(0)                 # 用0填充
    df.fillna(method='ffill')    # 用前一個有效值填充
    df.fillna({'col1': 0, 'col2': 100})  # 按列指定填充值

    ?刪除缺失值

    df2 = df.dropna()
    • dropna()默認刪除包含任何缺失值的行
    • 參數說明
    df.dropna(axis=0)       # 刪除行(默認)
    df.dropna(axis=1)       # 刪除列
    df.dropna(how='all')    # 只刪除全為缺失值的行
    df.dropna(thresh=2)     # 保留至少有2個非缺失值的行

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

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

    相關文章

    使用 Vue 實現移動端視頻錄制與自動截圖功能

    文章目錄技術棧功能介紹video標簽屬性完整代碼js 前端實現將視頻Blob轉Base64java 后端實現將視頻Base64轉mp4文件在移動端網頁開發中&#xff0c;使用攝像頭錄制視頻并自動生成截圖是一個常見的需求&#xff0c;比如身份認證、人臉識別或互動問卷等場景。本文將介紹如何使用 V…

    單片機是怎么控制步進電機的?

    步進電機作為一種將電脈沖信號轉化為角位移的執行機構&#xff0c;其運轉依賴于脈沖信號的控制&#xff0c;而單片機作為控制核心&#xff0c;通過輸出特定的脈沖信號和方向信號&#xff0c;實現對步進電機的步數、方向、轉速的精準控制&#xff0c;整個過程需結合驅動電路、程…

    數據庫binlog日志查看方案

    binlog可以查看當前數據庫中所有的修改操作&#xff0c;包含數據和結構的修改&#xff0c;所以掌握數據庫日志查看是有必要的 通過客戶端連接到mysql 查看binlog日志的存儲位置&#xff08;前提是已開啟binlog&#xff09; -- 查看日志文件列表 SHOW BINARY LOGS;結果示例-- 這…

    MinIO Go 客戶端使用詳解:對象存儲開發實戰指南

    MinIO GO-SDK ? 一、準備工作 1. 環境依賴 2. 安裝 SDK ?? 二、初始化 MinIO 客戶端 ?? 三、創建 Bucket(存儲桶) ?? 四、上傳對象 ?? 五、下載對象 ?? 六、列出對象列表 ??? 七、刪除對象 ?? 八、總結 ?? 推薦閱讀: 隨著云原生架構的發展,對象存儲已成為…

    linux-process

    Linux進程概念 1. 進程概念 1.1 理解馮諾依曼體系解構 馮諾依曼體系解構五大核心&#xff1a; 運算器&#xff1a;負責算數運算&#xff08;加減乘除&#xff09;和邏輯運算&#xff08;與或非&#xff09;。 控制器&#xff1a;從內存中讀取指令&#xff0c;并協調其他部件…

    《西蒙學習法》核心思想的感悟與思考

    以下是對《西蒙學習法》核心思想的感悟與思考&#xff0c;結合書中要點提煉為可實踐的學習哲學&#xff1a;一、破除學習迷思&#xff1a;從“記憶量”到“認知升級”學習≠記憶 大腦不是硬盤&#xff0c;知識存儲無限但時間有限。真正的學習是建立“解決問題的程序”&#xff…

    互聯網隱私的未來:Web3、區塊鏈與神秘法寶

    隨著互聯網技術的飛速發展&#xff0c;用戶隱私保護成為了一個全球性的話題。Web3和區塊鏈技術的出現&#xff0c;為互聯網隱私的未來提供了新的可能性。本文將探討這些技術如何塑造隱私保護的新格局&#xff0c;并介紹一些神秘的法寶&#xff0c;它們在保護用戶隱私方面發揮著…

    Go進階高并發(多線程)處理教程

    Go進階高并發處理教程 目錄 Go并發編程基礎Goroutine深入理解同步原語詳解并發模式與最佳實踐性能優化技巧實戰案例 Go并發編程基礎 什么是并發&#xff1f; 并發是指程序能夠同時處理多個任務的能力。Go語言從設計之初就將并發作為核心特性&#xff0c;提供了簡潔而強大的…

    一種基于單片機控制的太陽能電池板系統設計

    摘 要: 設計的太陽能電池板系統&#xff0c;以單片機單元為核心&#xff0c;集檢測、光能跟蹤、板面清潔、輸出控制為一體&#xff0c;解決了傳統太陽能板控制功能簡單、效率低的技術問題&#xff0c;達到了自動監測輸出電能、自動清洗板面、全方位跟蹤光伏發電最大效率點的技術…

    前端實現類瀏覽器的 Ctrl+F 全局搜索功能(Vue2 + mark.js,用于Electron 、QT等沒有瀏覽器Ctrl+F全局搜索功能的殼子中)

    &#x1f4bb; 在 Electron 中實現類瀏覽器的 CtrlF 全局搜索功能&#xff08;Vue2 mark.js&#xff09;本文介紹如何在 Electron 應用中構建一個像 Chrome 一樣的 CtrlF 查找框&#xff0c;支持全局高亮、滾動定位、關鍵詞計數與上下跳轉。? 背景 在網頁瀏覽器中&#xff0c…

    詳解力扣高頻 SQL 50 題-1757.可回收且低脂的產品【入門】

    傳送門&#xff1a;可回收且低脂的產品 題目 表&#xff1a;Products -------------------- | Column Name | Type | -------------------- | product_id | int | | low_fats | enum | | recyclable | enum | -------------------- product_id 是該表的主鍵&#xff08;具有…

    CSS3 網格元素

    CSS3 網格元素&#xff08;Grid Items&#xff09;是網格容器&#xff08;Grid Container&#xff09;的直接子元素&#xff0c;它們參與 CSS 網格布局&#xff0c;并根據網格容器的規則在網格中定位和排列。以下是對網格元素的詳細中文講解&#xff0c;涵蓋定義、相關屬性、用…

    30天打牢數模基礎-決策樹講解

    案例代碼一、代碼說明本代碼針對員工離職預測問題&#xff0c;使用CART決策樹算法&#xff08;基尼指數&#xff09;實現分類&#xff0c;并包含特征重要性評估和樹結構可視化。數據為模擬的10個員工樣本&#xff0c;特征包括工作年限、月薪、是否加班、團隊氛圍評分&#xff0…

    React與jQuery全棧實戰指南

    以下是為React工程師優化的jQuery全棧指南&#xff0c;結合Thymeleaf項目需求與React思維模式&#xff0c;整合核心概念、避坑策略及實戰技巧。內容依據官方文檔與多篇技術文章優化補充&#xff0c;保留原有框架并深化關鍵細節&#xff1a; ?一、jQuery核心設計哲學 vs React?…

    Redis分布式鎖的學習(八)

    一、分布式鎖 1.1、分布式鎖是什么&#xff1f; 是一種在分布式系統中協調多個進程/服務對共享資源進行互斥訪問的機制&#xff1b;確保在任意時刻&#xff0c;只有一個客戶端可以訪問資源。 1.2、為什么需要分布式鎖&#xff1f; 解決多個服務/進程對同共享資源競爭&…

    spring的常用注解匯總

    在 Spring 和 Spring Boot 框架中&#xff0c;有許多核心注解被廣泛應用。以下是常用的關鍵注解分類詳解&#xff1a;一、組件聲明與依賴注入注解作用示例Component通用組件聲明 (Bean 的泛化形式)Component public class ServiceImpl {...}Service標記服務層&#xff08;業務邏…

    Claude4、GPT4、Kimi K2、Gemini2.5、DeepSeek R1、Code Llama等2025主流AI編程大模型多維度對比分析報告

    2025主流AI編程大模型多維度對比分析報告引言&#xff1a;AI編程大模型的技術格局與選型挑戰一、核心模型概覽&#xff1a;技術定位與市場份額1.國際第一梯隊&#xff08;1&#xff09;Claude 4系列&#xff08;Anthropic&#xff09;&#xff08;2&#xff09;GPT-4.1&#xf…

    Overleaf中下載.aux和.bbl文件

    有些會議提交終稿的時候&#xff0c;可能會讓上傳.bbl和.aux文件&#xff0c;但是使用Overleaf下載下來的壓縮包中缺沒有這些文件在網上搜了一下都是用的舊版的Overleaf的教程&#xff0c;或者教程比較繁瑣&#xff0c;其實新版的Overleaf也可以直接下載 打開你的論文編譯好&am…

    uniapp寫app做測試手機通知欄展示內容

    uniapp寫app做測試手機通知欄展示內容 以下代碼&#xff1a;只是個簡單測試能不能給手機發送消息&#xff0c;能不能引導打開通知權限&#xff0c;能不能進行跳轉的功能, 增加 notify.js 以下文件 // 模擬本地通知功能 export function showNotification() {// 1. 檢查通知…

    分布式云計算:未來計算架構的全新演進

    隨著信息技術的不斷發展,尤其是云計算技術的飛速進步,企業和個人對計算資源的需求已經從傳統的單一數據中心向更為靈活、可擴展的分布式架構轉變。分布式云計算作為一種新興的云計算模型,旨在將計算資源和數據存儲分布在多個地理位置上,從而提供更加高效、安全和可靠的服務…