Pandas中Series序列的具體實(shí)現(xiàn)
一、Series 的核心定義
Series 是 Pandas 專為一維數(shù)據(jù)設(shè)計(jì)的結(jié)構(gòu),對(duì)比 NumPy 一維數(shù)組,核心差異是:
表格
| 特性 | Pandas Series | NumPy 一維數(shù)組 |
|---|---|---|
| 索引 | 支持自定義標(biāo)簽(字符串 / 數(shù)字 / 時(shí)間等) | 僅支持整數(shù)位置索引 |
| 數(shù)據(jù)類型 | 可混合類型(如同時(shí)存 int/str) | 僅支持同一種數(shù)據(jù)類型 |
| 缺失值 | 原生支持 NaN,內(nèi)置缺失值處理方法 | 需手動(dòng)處理 NaN |
| 功能 | 內(nèi)置統(tǒng)計(jì) / 對(duì)齊 / 可視化等方法 | 僅基礎(chǔ)數(shù)值計(jì)算 |
直觀理解:把 Series 想象成 “帶列名的一列數(shù)據(jù)”,由兩部分組成:
- values:數(shù)據(jù)本身(底層是 NumPy 數(shù)組);
- index:自定義標(biāo)簽(索引),和數(shù)據(jù)一一對(duì)應(yīng)。
二、創(chuàng)建 Series(核心語(yǔ)法)
創(chuàng)建 Series 的核心函數(shù)是 pd.Series(),最常用的 4 種方式如下:
1. 從列表 / 數(shù)組創(chuàng)建(基礎(chǔ))
import pandas as pd
import numpy as np
# 方式1:從列表創(chuàng)建(默認(rèn)整數(shù)索引 0,1,2...)
scores = [85, 92, 78, 90, 88]
s1 = pd.Series(scores)
print("從列表創(chuàng)建的Series:")
print(s1)
# 方式2:指定自定義索引
names = ["小明", "小紅", "小剛", "小麗", "小強(qiáng)"]
s2 = pd.Series(scores, index=names)
print("\n指定索引的Series:")
print(s2)
# 方式3:從NumPy數(shù)組創(chuàng)建
arr = np.array([15.2, 16.1, 14.8, 15.5])
s3 = pd.Series(arr, index=["1月", "2月", "3月", "4月"], name="月均溫度")
print("\n帶名稱的Series:")
print(s3)輸出:
從列表創(chuàng)建的Series:
0 85
1 92
2 78
3 90
4 88
dtype: int64
指定索引的Series:
小明 85
小紅 92
小剛 78
小麗 90
小強(qiáng) 88
dtype: int64
帶名稱的Series:
1月 15.2
2月 16.1
3月 14.8
4月 15.5
Name: 月均溫度, dtype: float64
2. 從字典創(chuàng)建(索引 = 字典 key,值 = 字典 value)
import pandas as pd
# 字典:鍵=姓名,值=分?jǐn)?shù)
score_dict = {"小明":85, "小紅":92, "小剛":78, "小麗":90}
s4 = pd.Series(score_dict)
print("從字典創(chuàng)建的Series:")
print(s4)輸出:
從字典創(chuàng)建的Series:
小明 85
小紅 92
小剛 78
小麗 90
dtype: int64
3. 創(chuàng)建含缺失值的 Series
import pandas as pd
import numpy as np
# 含NaN的Series(缺失值)
s5 = pd.Series([85, np.nan, 92, 78, np.nan], index=["小明", "小紅", "小剛", "小麗", "小強(qiáng)"])
print("含缺失值的Series:")
print(s5)輸出:
含缺失值的Series:
小明 85.0
小紅 NaN
小剛 92.0
小麗 78.0
小強(qiáng) NaN
dtype: float64
三、Series 的核心操作(索引 / 切片)
Series 支持兩種索引方式:標(biāo)簽索引(自定義 index)和位置索引(整數(shù)位置),這是和 NumPy 數(shù)組的核心區(qū)別。
1. 標(biāo)簽索引(最常用)
通過(guò)自定義索引取值 / 賦值:
import pandas as pd
s = pd.Series([85, 92, 78, 90], index=["小明", "小紅", "小剛", "小麗"])
# 取值:通過(guò)標(biāo)簽
print("小紅的分?jǐn)?shù):", s["小紅"]) # 92
# 賦值:通過(guò)標(biāo)簽
s["小剛"] = 80
print("\n修改小剛分?jǐn)?shù)后:")
print(s)
# 多標(biāo)簽取值(返回新Series)
print("\n小明和小麗的分?jǐn)?shù):")
print(s[["小明", "小麗"]])輸出:
小紅的分?jǐn)?shù): 92
修改小剛分?jǐn)?shù)后:
小明 85
小紅 92
小剛 80
小麗 90
dtype: int64
小明和小麗的分?jǐn)?shù):
小明 85
小麗 90
dtype: int64
2. 位置索引(和 NumPy 一致)
通過(guò)整數(shù)位置(0 開(kāi)始)取值,可用 iloc 明確指定位置索引(推薦,避免歧義):
import pandas as pd
s = pd.Series([85, 92, 78, 90], index=["小明", "小紅", "小剛", "小麗"])
# 直接用整數(shù)(簡(jiǎn)易寫法)
print("第2個(gè)元素(位置1):", s[1]) # 92
# 用iloc(明確位置索引,推薦)
print("第4個(gè)元素(位置3):", s.iloc[3]) # 90
# 位置切片
print("\n位置0-2的元素:")
print(s.iloc[0:3])輸出:
第2個(gè)元素(位置1): 92
第4個(gè)元素(位置3): 90
位置0-2的元素:
小明 85
小紅 92
小剛 78
dtype: int64
3. 布爾索引(篩選數(shù)據(jù))
和 NumPy 類似,通過(guò)布爾條件篩選元素:
import pandas as pd
s = pd.Series([85, 92, 78, 90, 88], index=["小明", "小紅", "小剛", "小麗", "小強(qiáng)"])
# 篩選分?jǐn)?shù)≥90的元素
high_score = s[s >= 90]
print("90分以上的學(xué)生:")
print(high_score)
# 篩選分?jǐn)?shù)在80-90之間的元素
mid_score = s[(s >= 80) & (s < 90)]
print("\n80-90分的學(xué)生:")
print(mid_score)輸出:
90分以上的學(xué)生:
小紅 92
小麗 90
dtype: int64
80-90分的學(xué)生:
小明 85
小強(qiáng) 88
dtype: int64
四、Series 的核心屬性與方法
1. 核心屬性(快速查看數(shù)據(jù)特征)
表格
| 屬性 | 作用 | 示例 |
|---|---|---|
| values | 返回底層 NumPy 數(shù)組 | s.values → array([85,92,78,90]) |
| index | 返回索引對(duì)象 | s.index → Index ([' 小明 ',' 小紅 ',' 小剛 ',' 小麗 '], dtype='object') |
| dtype | 返回?cái)?shù)據(jù)類型 | s.dtype → int64 |
| shape | 返回形狀(一維元組) | s.shape → (4,) |
| name | 返回 Series 名稱 | s.name → ' 分?jǐn)?shù)' |
| isnull() | 返回布爾 Series(NaN 為 True) | s.isnull() → 小紅:True, 小強(qiáng):True |
| notnull() | 返回布爾 Series(非 NaN 為 True) | s.notnull() → 小明:True, 小紅:False |
運(yùn)行
import pandas as pd
import numpy as np
s = pd.Series([85, np.nan, 92, 78], index=["小明", "小紅", "小剛", "小麗"], name="分?jǐn)?shù)")
print("底層數(shù)組:", s.values)
print("索引:", s.index)
print("數(shù)據(jù)類型:", s.dtype)
print("形狀:", s.shape)
print("名稱:", s.name)
print("缺失值判斷:")
print(s.isnull())輸出:
底層數(shù)組: [85. nan 92. 78.]
索引: Index(['小明', '小紅', '小剛', '小麗'], dtype='object')
數(shù)據(jù)類型: float64
形狀: (4,)
名稱: 分?jǐn)?shù)
缺失值判斷:
小明 False
小紅 True
小剛 False
小麗 False
dtype: bool
2. 常用方法(統(tǒng)計(jì) / 缺失值 / 排序)
(1)統(tǒng)計(jì)方法(和 NumPy 類似,但更友好)
import pandas as pd
import numpy as np
s = pd.Series([85, np.nan, 92, 78, 90], index=["小明", "小紅", "小剛", "小麗", "小強(qiáng)"])
# 基礎(chǔ)統(tǒng)計(jì)
print("均值(自動(dòng)忽略NaN):", s.mean()) # 86.25
print("中位數(shù):", s.median()) # 87.5
print("最大值/最小值:", s.max(), "/", s.min()) # 92 / 78
print("標(biāo)準(zhǔn)差:", s.std()) # 6.18...
# 描述性統(tǒng)計(jì)(一鍵生成)
print("\n描述性統(tǒng)計(jì):")
print(s.describe())輸出:
均值(自動(dòng)忽略NaN): 86.25
中位數(shù): 87.5
最大值/最小值: 92.0 / 78.0
標(biāo)準(zhǔn)差: 6.18465843842649
描述性統(tǒng)計(jì):
count 4.000000
mean 86.250000
std 6.184658
min 78.000000
25% 83.250000
50% 87.500000
75% 90.500000
max 92.000000
dtype: float64
(2)缺失值處理
import pandas as pd
import numpy as np
s = pd.Series([85, np.nan, 92, 78, np.nan], index=["小明", "小紅", "小剛", "小麗", "小強(qiáng)"])
# 1. 刪除缺失值
s_drop = s.dropna()
print("刪除缺失值后:")
print(s_drop)
# 2. 填充缺失值(均值/中位數(shù)/固定值)
s_fill_mean = s.fillna(s.mean()) # 均值填充
s_fill_0 = s.fillna(0) # 固定值填充
print("\n均值填充缺失值:")
print(s_fill_mean)輸出:
刪除缺失值后:
小明 85.0
小剛 92.0
小麗 78.0
dtype: float64
均值填充缺失值:
小明 85.0
小紅 85.0
小剛 92.0
小麗 78.0
小強(qiáng) 85.0
dtype: float64
(3)排序
import pandas as pd
s = pd.Series([85, 92, 78, 90], index=["小明", "小紅", "小剛", "小麗"])
# 按值升序排序
s_sort_val = s.sort_values()
print("按分?jǐn)?shù)升序:")
print(s_sort_val)
# 按索引降序排序
s_sort_idx = s.sort_index(ascending=False)
print("\n按姓名降序:")
print(s_sort_idx)輸出:
按分?jǐn)?shù)升序:
小剛 78
小明 85
小麗 90
小紅 92
dtype: int64
按姓名降序:
小麗 90
小紅 92
小明 85
小剛 78
dtype: int64
(4)值替換 / 映射
import pandas as pd
s = pd.Series([85, 92, 78, 59, 90], index=["小明", "小紅", "小剛", "小亮", "小麗"])
# 替換單個(gè)值(不及格→60)
s_replace = s.replace(59, 60)
print("替換不及格分?jǐn)?shù)后:")
print(s_replace)
# 映射(分?jǐn)?shù)→等級(jí))
grade_map = {x: "優(yōu)秀" if x>=90 else "良好" if x>=80 else "及格" for x in s}
s_grade = s.map(grade_map)
print("\n分?jǐn)?shù)映射為等級(jí):")
print(s_grade)輸出:
替換不及格分?jǐn)?shù)后:
小明 85
小紅 92
小剛 78
小亮 60
小麗 90
dtype: int64
分?jǐn)?shù)映射為等級(jí):
小明 良好
小紅 優(yōu)秀
小剛 及格
小亮 及格
小麗 優(yōu)秀
dtype: object
五、Series 與 NumPy 數(shù)組 / 列表的轉(zhuǎn)換
實(shí)際開(kāi)發(fā)中常需要在不同結(jié)構(gòu)間轉(zhuǎn)換:
import pandas as pd
import numpy as np
# 1. Series → NumPy數(shù)組
s = pd.Series([85, 92, 78, 90], index=["小明", "小紅", "小剛", "小麗"])
arr = s.values
print("Series轉(zhuǎn)數(shù)組:", arr) # [85 92 78 90]
# 2. Series → 列表
lst = s.tolist()
print("Series轉(zhuǎn)列表:", lst) # [85, 92, 78, 90]
# 3. NumPy數(shù)組 → Series
arr2 = np.array([15.2, 16.1, 14.8])
s2 = pd.Series(arr2, index=["1月", "2月", "3月"])
print("\n數(shù)組轉(zhuǎn)Series:")
print(s2)
# 4. 列表 → Series
lst2 = [88, 76, 95]
s3 = pd.Series(lst2, index=["小強(qiáng)", "小芳", "小偉"])
print("\n列表轉(zhuǎn)Series:")
print(s3)六、實(shí)戰(zhàn)場(chǎng)景:Series 的典型應(yīng)用
場(chǎng)景 1:時(shí)間序列數(shù)據(jù)處理
import pandas as pd
import numpy as np
# 創(chuàng)建日期索引的Series(7天溫度)
dates = pd.date_range(start="2026-01-01", periods=7)
temp = pd.Series(np.random.normal(5, 3, 7).round(1), index=dates, name="日溫")
# 查看數(shù)據(jù)
print("7天溫度數(shù)據(jù):")
print(temp)
# 篩選1月3日之后的溫度
print("\n1月3日之后的溫度:")
print(temp[temp.index >= "2026-01-03"])
# 計(jì)算周平均溫度
print("\n周平均溫度:", temp.mean())場(chǎng)景 2:數(shù)據(jù)清洗(缺失值填充)
import pandas as pd
import numpy as np
# 模擬學(xué)生分?jǐn)?shù)(含缺失值)
scores = pd.Series([85, np.nan, 92, 78, np.nan, 88, 95],
index=["小明", "小紅", "小剛", "小麗", "小強(qiáng)", "小芳", "小偉"])
# 步驟1:統(tǒng)計(jì)缺失值數(shù)量
nan_count = scores.isnull().sum()
print("缺失值數(shù)量:", nan_count)
# 步驟2:用中位數(shù)填充缺失值
scores_filled = scores.fillna(scores.median())
print("\n填充后的分?jǐn)?shù):")
print(scores_filled)
# 步驟3:篩選優(yōu)秀學(xué)生(≥90)
excellent = scores_filled[scores_filled >= 90]
print("\n優(yōu)秀學(xué)生:")
print(excellent)七、避坑點(diǎn)與最佳實(shí)踐
1. 核心避坑點(diǎn)
- ? 混淆標(biāo)簽索引和位置索引:當(dāng)索引是整數(shù)時(shí)(如 index=[1,2,3]),s[1] 會(huì)優(yōu)先按標(biāo)簽取值,而非位置,建議用 iloc 明確位置索引;
- ? 忽略缺失值:Series 的統(tǒng)計(jì)方法(如 mean())會(huì)自動(dòng)忽略 NaN,但如果需要包含 NaN 需手動(dòng)處理;
- ? 直接修改 Series 索引:index 是不可變對(duì)象,需用 s.reset_index() 或 s.set_index() 修改;
- ? 布爾條件組合錯(cuò)誤:多條件組合需用 &/|(而非 and/or),且每個(gè)條件需用括號(hào)包裹。
2. 最佳實(shí)踐
- ? 索引命名:創(chuàng)建 Series 時(shí)給 index 和 name 命名,增強(qiáng)可讀性;
- ? 明確索引方式:位置索引用 iloc,標(biāo)簽索引用 loc(s.loc["小紅"]),避免歧義;
- ? 缺失值處理:先統(tǒng)計(jì)缺失值數(shù)量(isnull().sum()),再選擇填充 / 刪除策略;
- ? 大數(shù)據(jù)處理:Series 底層是 NumPy 數(shù)組,優(yōu)先用向量化方法(如 map/apply),避免循環(huán)。
總結(jié)
- Series 是 Pandas 一維帶標(biāo)簽的數(shù)據(jù)結(jié)構(gòu),由 values(數(shù)據(jù))和 index(標(biāo)簽)組成,支持混合數(shù)據(jù)類型和缺失值;
- 核心操作:
- 索引:標(biāo)簽索引(s["小紅"]/s.loc["小紅"])、位置索引(s.iloc[1]);
- 篩選:布爾索引(s[s>=90]);
- 統(tǒng)計(jì):mean()/median()/std()(自動(dòng)忽略 NaN);
- 缺失值:dropna()/fillna();
- 核心優(yōu)勢(shì):對(duì)比 NumPy 數(shù)組,Series 支持自定義標(biāo)簽、缺失值原生處理、豐富的統(tǒng)計(jì) / 清洗方法;
- 避坑關(guān)鍵:明確索引方式,處理缺失值,正確組合布爾條件。
到此這篇關(guān)于Pandas中Series序列的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pandas Series序列內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)的分層隨機(jī)抽樣案例
這篇文章主要介紹了python實(shí)現(xiàn)的分層隨機(jī)抽樣案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python matplotlib繪圖實(shí)現(xiàn)刪除重復(fù)冗余圖例的操作
這篇文章主要介紹了python matplotlib繪圖實(shí)現(xiàn)刪除重復(fù)冗余圖例的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04
Python?opencv圖像膨脹與腐蝕處理實(shí)例探究
這篇文章主要介紹了Python?opencv圖像膨脹與腐蝕處理實(shí)例探究2024-01-01
如何配置關(guān)聯(lián)Python 解釋器 Anaconda的教程(圖解)
這篇文章主要介紹了如何配置關(guān)聯(lián)Python 解釋器 Anaconda的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)火鍋工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
使用python opencv對(duì)目錄下圖片進(jìn)行去重的方法
今天小編就為大家分享一篇使用python opencv對(duì)目錄下圖片進(jìn)行去重的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
使用Django和Ansible實(shí)現(xiàn)自動(dòng)化部署方式
這篇文章主要介紹了使用Django和Ansible實(shí)現(xiàn)自動(dòng)化部署方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法
今天小編就為大家分享一篇numpy.ndarray 交換多維數(shù)組(矩陣)的行/列方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08

