Pandas數據結構詳解Series與DataFrame

Pandas數據結構詳解:Series與DataFrame實戰指南

前言

Pandas是Python數據分析的核心庫,其強大的數據處理能力主要基于兩種核心數據結構:SeriesDataFrame。本文將深入解析這兩種數據結構的概念、創建方式、常用屬性和方法,并通過豐富的實戰案例幫助讀者掌握Pandas的基礎操作。

一、Series數據結構詳解

1.1 Series概念與特點

Series是Pandas中的一維數據結構,可以理解為帶標簽的一維數組。每個Series對象包含兩個主要組成部分:

  • 數據值(Values):一組值,支持NumPy的所有數據類型
  • 索引(Index):與數據值對應的標簽,類似于字典的鍵

核心特點:

  • 類似于Excel中的一列數據
  • 支持通過標簽訪問數據
  • 自動創建從0開始的整數索引(如果未指定)

1.2 Series的創建方式

方式一:通過NumPy數組創建
import numpy as np
import pandas as pd# 創建ndarray對象
arr = np.array([1, 2, 3, 4, 5])
print(arr)  # [1 2 3 4 5]# 轉換為Series對象
s1 = pd.Series(arr)
print(s1)
# 輸出:
# 0    1
# 1    2
# 2    3
# 3    4
# 4    5
# dtype: int64
方式二:通過Python列表創建
# 直接傳入列表
s2 = pd.Series([1, 2, 3, 4, 5])
print(s2)# 指定自定義索引
s3 = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
print(s3)
# 輸出:
# a    1
# b    2
# c    3
# d    4
# e    5
# dtype: int64
方式三:通過字典創建
# 字典的鍵自動成為索引
s4 = pd.Series({'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5})
print(s4)

1.3 Series的常用屬性

# 創建示例Series
s = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])# 基本屬性
print(s.dtype)      # 數據類型:int64
print(s.shape)      # 維度:(5,)
print(s.size)       # 元素個數:5
print(s.index)      # 索引:Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
print(s.values)     # 值:array([1, 2, 3, 4, 5])
print(s.name)       # 名稱:None

1.4 Series的常用方法

統計方法
s = pd.Series([1, 2, 3, 4, 2, 3], index=['a', 'b', 'c', 'd', 'e', 'f'])# 基礎統計
print(s.count())    # 非空元素個數:6
print(s.sum())      # 總和:15
print(s.mean())     # 平均值:2.5
print(s.median())   # 中位數:2.5
print(s.mode())     # 眾數:2, 3
print(s.std())      # 標準差:1.0488088481701516
print(s.var())      # 方差:1.1
print(s.min())      # 最小值:1
print(s.max())      # 最大值:4# 描述性統計
print(s.describe())
# 輸出:
# count    6.000000
# mean     2.500000
# std      1.048809
# min      1.000000
# 25%      2.000000
# 50%      2.500000
# 75%      3.000000
# max      4.000000
# dtype: float64
數據操作方法
# 查看數據
print(s.head(3))    # 前3行
print(s.tail(3))    # 后3行# 排序
print(s.sort_values())                    # 按值升序
print(s.sort_values(ascending=False))     # 按值降序
print(s.sort_index())                     # 按索引升序# 去重和統計
print(s.unique())           # 唯一值:[1 2 3 4]
print(s.value_counts())     # 值計數:2    2, 3    2, 1    1, 4    1
print(s.drop_duplicates())  # 刪除重復值

1.5 Series的布爾索引

# 讀取科學家數據
df = pd.read_csv("data/scientists.csv")
ages_series = df['Age']# 計算平均年齡
mean_age = ages_series.mean()
print(f"平均年齡:{mean_age}")  # 59.125# 布爾索引篩選
older_scientists = ages_series[ages_series > mean_age]
print("年齡大于平均年齡的科學家:")
print(older_scientists)# 獲取符合條件的完整信息
older_info = df[ages_series > mean_age][["Name", "Age"]]
print(older_info)

1.6 Series的運算操作

# Series與數值運算
ages_series = df['Age']
print(ages_series + 10)  # 每個年齡加10
print(ages_series * 2)   # 每個年齡乘2# Series與Series運算
print(ages_series + ages_series)  # 對應元素相加# 基于索引的運算
sorted_ages = ages_series.sort_values(ascending=False)
print(ages_series + sorted_ages)  # 按索引匹配運算

二、DataFrame數據結構詳解

2.1 DataFrame概念與特點

DataFrame是Pandas中最核心的數據結構,可以理解為二維表格,類似于Excel工作表或SQL數據庫表。

核心特點:

  • 二維表格結構(行和列)
  • 每列是一個Series對象
  • 所有列共享同一個行索引
  • 支持多種數據類型的列

2.2 DataFrame的創建方式

方式一:通過字典創建
# 基礎字典創建
dict_data = {'name': ['張三', '李四', '王五'],'age': [18, 19, 20],'sex': ['男', '女', '男']
}df1 = pd.DataFrame(dict_data)
print(df1)
# 輸出:
#    name  age sex
# 0  張三   18  男
# 1  李四   19  女
# 2  王五   20  男# 指定行索引
df2 = pd.DataFrame(dict_data, index=['a', 'b', 'c'])
print(df2)# 指定行索引和列索引
df3 = pd.DataFrame(dict_data, index=['a', 'b', 'c'], columns=['id', 'name', 'age', 'sex'])
print(df3)  # 不存在的列用NaN填充
方式二:通過CSV文件創建
# 讀取CSV文件
df = pd.read_csv("data/scientists.csv")
print(df.head())# 指定索引列
df = pd.read_csv("data/scientists.csv", index_col='id')
print(df.head())

2.3 DataFrame的常用屬性

df = pd.read_csv("data/scientists.csv")# 基本屬性
print(df.index)     # 行索引
print(df.columns)   # 列名
print(df.values)    # 數據值
print(df.shape)     # 維度:(8, 5)
print(df.size)      # 元素個數:40
print(df.ndim)      # 維度數:2
print(df.dtypes)    # 每列的數據類型

2.4 DataFrame的常用方法

數據查看方法
print(df.head())        # 前5行
print(df.tail(3))       # 后3行
print(df.info())        # 數據信息
print(df.describe())    # 描述性統計# 按數據類型統計
print(df.describe(exclude=['object']))  # 排除字符串類型
print(df.describe(include='all'))       # 包含所有類型
數據篩選方法
# 布爾索引篩選
movie_df = pd.read_csv("data/movie.csv")
long_movies = movie_df[movie_df.duration > movie_df.duration.mean()]
print(long_movies[["director_name", 'duration']].head())# 多條件篩選
result = movie_df[(movie_df.duration > 120) & (movie_df.budget > 50000000)
]
print(result.head())

2.5 DataFrame的列操作

添加列
movie_df = pd.read_csv("data/movie.csv", index_col='movie_title')# 添加簡單列
movie_df['has_seen'] = 0
print(movie_df.head())# 添加計算列
movie_df['director_actor_facebook_likes'] = (movie_df['director_facebook_likes'] +movie_df['actor_1_facebook_likes'] +movie_df['actor_2_facebook_likes'] +movie_df['actor_3_facebook_likes']
)
print(movie_df.head())
刪除列
# 刪除單列
movie_df.drop("has_seen", axis=1, inplace=True)# 刪除多列
movie_df.drop(["actor_1_name", "actor_2_name", "actor_3_name"], axis=1, inplace=True)# 刪除行
movie_df.drop("Avatar", axis=0, inplace=True)
插入列
# 在指定位置插入列
movie_df.insert(0, "profit", movie_df["gross"] - movie_df["budget"])
print(movie_df.head())

2.6 DataFrame的運算操作

# DataFrame與數值運算
print(df * 2)  # 每個元素乘2# DataFrame與DataFrame運算
print(df + df)  # 對應元素相加# 索引不匹配的運算
print(df + df[0:4])  # 不匹配的索引用NaN填充

三、實戰案例分析

3.1 科學家數據分析

# 讀取數據
scientists_df = pd.read_csv("data/scientists.csv")# 基礎統計
print("科學家年齡統計:")
print(scientists_df['Age'].describe())# 按職業分組統計
occupation_stats = scientists_df.groupby('Occupation')['Age'].agg(['mean', 'count'])
print("\n各職業年齡統計:")
print(occupation_stats)# 篩選長壽科學家
long_lived = scientists_df[scientists_df['Age'] > 70]
print(f"\n年齡超過70歲的科學家:{len(long_lived)}人")
print(long_lived[['Name', 'Age', 'Occupation']])

3.2 餐廳小費數據分析

# 讀取小費數據
tips_df = pd.read_csv("data/tips.csv")# 基礎統計
print("小費數據分析:")
print(f"總賬單平均:${tips_df['total_bill'].mean():.2f}")
print(f"小費平均:${tips_df['tip'].mean():.2f}")
print(f"小費比例:{tips_df['tip'].sum() / tips_df['total_bill'].sum() * 100:.1f}%")# 按性別分析
gender_tips = tips_df.groupby('sex')['tip'].agg(['mean', 'count'])
print("\n按性別分析小費:")
print(gender_tips)# 按星期分析
day_tips = tips_df.groupby('day')['tip'].mean().sort_values(ascending=False)
print("\n按星期分析平均小費:")
print(day_tips)

3.3 電影數據分析

# 讀取電影數據
movie_df = pd.read_csv("data/movie.csv")# 計算利潤率
movie_df['profit_margin'] = ((movie_df['gross'] - movie_df['budget']) / movie_df['budget'] * 100
)# 篩選盈利電影
profitable_movies = movie_df[movie_df['profit_margin'] > 0]
print(f"盈利電影數量:{len(profitable_movies)}")
print(f"盈利電影比例:{len(profitable_movies) / len(movie_df) * 100:.1f}%")# 按導演分析
director_stats = movie_df.groupby('director_name').agg({'profit_margin': 'mean','movie_title': 'count'
}).rename(columns={'movie_title': 'movie_count'})# 篩選多部電影的導演
top_directors = director_stats[director_stats['movie_count'] >= 3].sort_values('profit_margin', ascending=False)
print("\n多部電影導演的利潤率排名:")
print(top_directors.head(10))

四、最佳實踐與注意事項

4.1 性能優化建議

  1. 使用適當的數據類型:根據數據特點選擇合適的數據類型
  2. 避免鏈式操作:減少中間變量的創建
  3. 使用向量化操作:避免使用循環,優先使用Pandas的內置方法

4.2 常見錯誤與解決方案

  1. SettingWithCopyWarning:使用.copy().loc避免鏈式索引
  2. 數據類型不匹配:注意數值運算時的數據類型轉換
  3. 索引不匹配:確保運算時索引的一致性

4.3 代碼規范

# 推薦的代碼風格
import pandas as pd
import numpy as np# 讀取數據
df = pd.read_csv("data.csv")# 數據預處理
df_clean = df.dropna().copy()# 數據分析
result = df_clean.groupby('category').agg({'value': ['mean', 'std', 'count']
})# 結果輸出
print(result)

五、總結

本文詳細介紹了Pandas的兩種核心數據結構:Series和DataFrame。通過豐富的代碼示例和實戰案例,我們學習了:

  1. Series:一維帶標簽數組,支持多種創建方式和強大的統計方法
  2. DataFrame:二維表格結構,是數據分析的主要工具
  3. 數據操作:包括篩選、運算、列操作等常用功能
  4. 實戰應用:通過真實數據集展示了數據分析的完整流程

掌握這些基礎知識后,你將能夠:

  • 高效地處理各種格式的數據
  • 進行基礎的數據清洗和預處理
  • 執行描述性統計分析
  • 為更高級的數據分析任務打下堅實基礎

Pandas的強大之處在于其豐富的生態系統和與其他數據科學庫的無縫集成。建議讀者在實際項目中多加練習,逐步掌握更多高級功能。


關鍵詞:Pandas、Series、DataFrame、數據分析、Python、數據科學

相關推薦

  • NumPy基礎入門實戰指南
  • MySQL窗口函數與PyMySQL實戰指南
  • 數據結構與算法基礎

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

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

相關文章

TensorRT-LLM.V1.1.0rc0:在無 GitHub 訪問權限的服務器上編譯 TensorRT-LLM 的完整實踐

一、TensorRT-LLM有三種安裝方式,從簡單到難 1.NGC上的預構建發布容器進行部署,見《tensorrt-llm0.20.0離線部署DeepSeek-R1-Distill-Qwen-32B》。 2.通過pip進行部署。 3.從源頭構建再部署。 在實際開發中,我們常常面臨這樣的場景:本地筆記…

完整、可落地的 Elasticsearch 拼音補全配置模板 設計方案

在中文搜索場景中,用戶經常使用拼音輸入(如 “iPhone”、“pingguo”)來搜索中文內容(如“蘋果手機”)。為了提升用戶體驗,Elasticsearch 可通過 拼音分詞器 Completion Suggester 實現 拼音補全&#xff…

Redis面試精講 Day 23:Redis與數據庫數據一致性保障

【Redis面試精講 Day 23】Redis與數據庫數據一致性保障 在“Redis面試精講”系列的第23天,我們將深入探討Redis與數據庫數據一致性保障這一在高并發分布式系統中極為關鍵的技術難題。該主題是面試中的高頻壓軸題,常出現在中高級后端開發、架構師崗位的考…

HTML <link rel=“preload“>:提前加載關鍵資源的性能優化利器

在網頁性能優化中&#xff0c;“資源加載時機”是影響用戶體驗的關鍵因素——一個延遲加載的核心CSS可能導致頁面“閃白”&#xff0c;一段未及時加載的關鍵JS可能讓交互按鈕失效。傳統的資源加載方式&#xff08;如<link>加載CSS、<script>加載JS&#xff09;依賴…

WPF加載記憶上次圖像

問題點使用MVVM先viewModel構造函數然后才Loaded事件,但Loaded事情時halcon控件沒有加載完畢。Window_ContentRendered事件中halcon控件才有了句柄。解決問題1.viewModel函數中調用相機的類獲取相機名(在這里是為了MVVM中以后可以做其它的事情如識別二維碼)2.在Window_ContentR…

AT89C52單片機介紹

目錄 1AT89C52原理圖及結構框圖 1.1 原理圖 1.2 AT89C52 結構框圖 1.2.1 8 位 CPU 1.2.2 存儲器 1.2.3 I/O 端口 1.2.4 定時器 / 計數器 1.2.5 串行通信接口 1.2.6 中斷系統 1.2.7 時鐘與復位 1.2.8 總線結構 1.2.9 特殊功能寄存器區 2 AT89C52引腳介紹(PDIP) …

聯網車輛功能安全和網絡安全的挑戰與當前解決方案

摘要在過去的二十年里&#xff0c;數字化重塑了我們的日常生活&#xff0c;汽車行業也身處這一變革之中。如今的車輛正變得日益智能且聯網&#xff0c;具備了更多的安全和便捷功能&#xff08;如自動緊急制動、自適應巡航控制&#xff09;。下一代車輛將實現高度自動化乃至 5 級…

網絡安全(Java語言)腳本 匯總(二)

文章目錄目錄遍歷漏洞掃描器源代碼思路一、核心功能二、依賴庫三、核心流程四、關鍵方法五、數據結構六、輸出信息目錄遍歷漏洞掃描器 源代碼 /*** description : 目錄遍歷漏洞掃描器* 注意; 在輸入URL時 要求必須保存 ?page 的末尾 才能保證路徑合成的有效性*//*** desc…

基于 ArcFace/ArcMargin 損失函數的深度特征學習高性能人臉識別解決方案

要實現當前最先進的人臉識別系統,我們需要采用業界公認性能最佳的算法框架,主要包括基于 ArcFace/ArcMargin 損失函數的深度特征學習、MTCNN 人臉檢測與對齊以及高效特征檢索三大核心技術。以下是優化后的解決方案: 核心優化點說明 算法選擇:采用 ArcFace(Additive Angul…

Sql server 查詢每個表大小

在SQL Server中&#xff0c;你可以通過查詢系統視圖和系統表來獲取數據庫中每個表的大小。這可以通過幾種不同的方式來實現&#xff0c;下面是一些常用的方法&#xff1a;方法1&#xff1a;使用sp_spaceused存儲過程sp_spaceused是一個內置的存儲過程&#xff0c;可以用來顯示數…

react 錯誤邊界

注意點&#xff1a; 類組件是可以和函數式組件混合寫的&#xff01;&#xff01;&#xff01;getDerivedStateFromError是靜態的&#xff0c;避免副作用&#xff0c;如果想將錯誤上報到服務器&#xff0c;則去componentDidCatch里去處理。getDerivedStateFromError直接返回{ ha…

自定義 VSCode 標題欄以區分不同版本

自定義 VSCode 標題欄以區分不同版本 當您在同一臺計算機上使用多個 Visual Studio Code 版本時&#xff0c;自定義窗口標題欄是一個有效的方法&#xff0c;可以幫助您快速區分它們。 為何需要區分多個 VSCode 版本&#xff1f; 在同一臺電腦上安裝和使用多個 VSCode 實例是很常…

失敗存儲:查看未成功的內容

作者&#xff1a;來自 Elastic James Baiera 及 Graham Hudgins 了解失敗存儲&#xff0c;這是 Elastic Stack 的一項新功能&#xff0c;用于捕獲和索引之前丟失的事件。 想獲得 Elastic 認證嗎&#xff1f;看看下一期 Elasticsearch Engineer 培訓什么時候開始&#xff01; E…

基于Spring Boot+Vue的萊元元電商數據分析系統 銷售數據分析 天貓電商訂單系統

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

Node.js/Python 實戰:封裝淘寶商品詳情 API 客戶端庫(SDK)

在開發電商相關應用時&#xff0c;我們經常需要與淘寶 API 交互獲取商品數據。直接在業務代碼中處理 API 調用邏輯會導致代碼冗余且難以維護。本文將實戰演示如何使用 Node.js 和 Python 封裝一個高質量的淘寶商品詳情 API 客戶端庫&#xff08;SDK&#xff09;&#xff0c;使開…

【Docker】關于hub.docker.com,無法打開,國內使用dockers.xuanyuan.me搜索容器鏡像、查看容器鏡像的使用文檔

&#x1f527; 一、國內鏡像搜索替代方案 國內鏡像源網站 毫秒鏡像&#xff1a;支持鏡像搜索&#xff08;如 https://dockers.xuanyuan.me&#xff09;&#xff0c;提供中文文檔服務&#xff08;https://dockerdocs.xuanyuan.me&#xff09;&#xff0c;可直接搜索鏡像名稱并…

2025盛夏AI熱浪:八大技術浪潮重構數字未來

——從大模型革命到物理智能&#xff0c;AI如何重塑產業與人機關系&#x1f31f; 引言&#xff1a;AI從“技術爆炸”邁向“應用深水區」代碼示例&#xff1a;AI商業化閉環驗證模型# 驗證AI商業化閉環的飛輪效應 def validate_ai_flywheel(compute_invest, app_adoption): re…

從希格斯玻色子到 QPU:C++ 的跨維度征服

一、引言&#xff1a;粒子物理與量子計算的交匯點在當代物理學和計算機科學的前沿領域&#xff0c;希格斯玻色子研究與量子計算技術的交匯正形成一個激動人心的跨學科研究方向。希格斯玻色子作為標準模型中最后被發現的基本粒子&#xff0c;其性質和行為對我們理解物質質量的起…

Elasticsearch:如何使用 Qwen3 來做向量搜索

在這篇文章中&#xff0c;我們將使用 Qwen3 來針對數據進行向量搜索。我們將對數據使用 qwen3 嵌入模型來進行向量化&#xff0c;并使用 Qwen3 來對它進行推理。在閱讀這篇文章之前&#xff0c;請閱讀之前的文章 “如何使用 Ollama 在本地設置并運行 Qwen3”。 安裝 Elasticsea…

Mybatis實現頁面增刪改查

一、改變路由警告 二、實現新增數據 1.UserMapper.xml 2.Controller層 注意:前端傳的是json對象,所以后臺也需要使用JSON 3.設置提交的表單 <el-dialog title"信息" v-model"data.formVisible" width"30%" destroy-on-close><el-form…