惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
A
About on SuperTechFans
Apple Machine Learning Research
Apple Machine Learning Research
The Register - Security
The Register - Security
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
博客园_首页
U
Unit 42
T
Tailwind CSS Blog
G
GRAHAM CLULEY
F
Full Disclosure
V
Vulnerabilities – Threatpost
T
Tenable Blog
月光博客
月光博客
P
Privacy & Cybersecurity Law Blog
P
Privacy International News Feed
K
Kaspersky official blog
Scott Helme
Scott Helme
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
有赞技术团队
有赞技术团队
Recent Commits to openclaw:main
Recent Commits to openclaw:main
L
LINUX DO - 最新话题
Recorded Future
Recorded Future
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
SecWiki News
SecWiki News
P
Proofpoint News Feed
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
罗磊的独立博客
S
Security Affairs
M
MIT News - Artificial intelligence
L
LINUX DO - 热门话题
美团技术团队
Simon Willison's Weblog
Simon Willison's Weblog
T
Threat Research - Cisco Blogs
Stack Overflow Blog
Stack Overflow Blog
Forbes - Security
Forbes - Security
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
Visual Studio Blog

博客园 - tsembrace

Pandas数据分析教程,由浅入深讲解(五)Pandas IO操作 Pandas数据分析教程,由浅入深讲解(四) Pandas数据分析教程,由浅入深讲解(三) Pandas数据分析教程,由浅入深讲解(二) B站黑马Python+AI零基础入门(二)AI应用-实战 B站黑马Python+AI零基础入门(一)AI应用-基础 B站清华128小时Python高级教程一(C3深入类和对象) B站清华128小时Python高级教程一(C1、C2) B站python入门学习---第二阶段第二章数据库、SQL和MySQL B站python入门学习---第二阶段第一章类和对象 B站python入门学习---第一阶段第十章 数据可视化 B站python入门学习---第一阶段第八~九章 文件操作、异常、模块与包 B站python入门学习---第一阶段前七章回顾复习(二) B站python入门学习---第一阶段前七章回顾复习(一) Python入门学习(十)第十四章其他 Python入门学习(九)Python的高级语法与用法(四)装饰器 Python入门学习(九)Python的高级语法与用法(三)函数式编程 Python入门学习(九)Python的高级语法与用法(二)闭包 Python入门学习(九)Python的高级语法与用法(一)枚举 Python入门学习(八)JSON、反序列化、序列化 Python入门学习(七)高级部分:正则表达式(二) Python入门学习(七)高级部分:正则表达式 Python入门学习(六)高级部分:面向对象 Python入门学习(五)函数 Python入门学习(四)流程控制 包与模块
Pandas数据分析教程,由浅入深讲解(一)
tsembrace · 2026-05-15 · via 博客园 - tsembrace

一、Pandas核心数据类型

(一)什么是Pandas

Pandas是Python用于数据分析的一个扩展程序库,名字衍生于术语“panel data(面板数据)”和“Python data analysis”;Pandas可以从各种文件格式导入数据,比如CSV、JSON、SQL、Excel等;并可以对各种数据进行运算操作,比如归并、再成形、选择以及数据清洗和加工特征。

Pandas的主要数据结构是Series(一维)和DataFrame(二维数据)。

(二)Series

Series是一种类似于字典(dict-like)的一维数组的对象,由两部分组成:1、values:一组数据(ndarray类型);2、index:相关的数据索引标签。

python中字典是无序的,但Series却是有序的。

1、series的构造 

import numpy as np
import pandas as pd
# pandas中的series则是有序的,又是dict-like的
arr1 = np.random.randint(0, 10, size = 5)

# 隐式索引,定义时候未明确索引名的则按0,1,2...去作为其内容的对应索引
s1 = pd.Series(data = [1, 3, 5, 7])

# 显式索引,通过index设置;未显式设置则默认用隐式索引
s2 = pd.Series(data = arr1, index = ["A", "B", "C", "D", "E"])

 s1和s2输出如下:

# s1
0    1
1    3
2    5
3    7
dtype: int64

# s2
A    10
B     6
C     2
D     0
E     1
dtype: int32

上面的s1的构造是通过列表;而s2的构造则是先利用np中的ndarray构造了一个arr1,再将arr1作为s2的内容。

但需要注意的是利用ndarray构造的是引用对象,Series的内容实质还是指向原先ndarray创建的内存,即引用。

而利用列表构造得到是副本对象,即Series会新建一块内存区域存放原先列表的内容,作为自己的内容。

# 使用字典构造Series,字典的键就默认设置为显式索引,values作为值
dict1 = {
    "Name":"Tony",
    "Age":18,
    "City":"Nanjing"
}
s3 = pd.Series(data = dict1)

当然,还可以直接通过字典去构造Series,字典的键就自动设置为Series的显式索引,values自动设置为Series的值。

在使用字典构造时,有时候我们可能只需要原字典中的某些项,那么就可以通过index设置

dict2 = {
    "Name":"Jack",
    "Age":18,
    "City":"NJ",
    "Hobby":"Soccer"
}
# 如果Series中只需要原字典中键Name和city对应的内容,则如下:
s4 = pd.Series(data = dict2, index = ["Name", "City"])
s4
"""
Name       Tony
City    Nanjing
dtype: object
"""
# 如果Series中除了原字典中的Hobby之外,还需要其他索引,则如下:
s5 = pd.Series(data = dict2, index = ["Hobby", "Birthday", "Sex"])
s5
"""
Hobby       Soccer
Birthday       NaN
Sex            NaN
dtype: object
"""

最后一种构造方法就是使用一个标量(常量或变量),这种方法必须指定index,标量会被赋值匹配到每一个index.

city_index = ["南京", "上海", "武汉", "广州", "福州"]
s6 = pd.Series(data = 18888, index = city_index)
s6
"""
南京    18888
上海    18888
武汉    18888
广州    18888
福州    18888
dtype: int64
"""

 2、Series的重要属性 

*name返回Series对象的名字;*shape返回Series对象的形状;*size返回Series对象的元素个数;*index返回Series对象的显式索引;*values返回Series对象的所有元素值

可以通过Series变量名.索引名的方式获取对应的value值,也可以通过类似字典的方式即Series变量名[索引名]获取

import numpy as np
import pandas as pd
s1 = pd.Series(data = ["Tom", 12, "melburn", "male"], index = ["nickname", "age", "city", "sex"])
print(s1.nickname, s1.city, s1["sex"], s1["age"])

# 输出
Tom melburn male 12

name属性可以在创建Series对象时设置:

s2 = pd.Series(data = [1, 3, 5, 7], index = list("ABCD"), name = "num_series")
print(s2.name)

shape可以简单理解为元素个数,因为Series是一维的,在超过一维情况下,才会体会到“shape(形状)”的感觉

s2 = pd.Series(data = [1, 3, 5, 7], index = list("ABCD"), name = "num_series")
print(s2.name)   # num_series
print(s2.shape)  # (4,)
print(s2.dtype)  # int64
print(s2.size)  # 4
print(s2.index)  # Index(['A', 'B', 'C', 'D'], dtype='object')
print(s2.values)  # [1 3 5 7]

3、Series的数学运算

(1)与非pandas对象的运算

广播机制,将数据广播给每一个Series对象的值再进行运算

如下,与int整型数据运算:

s1 = pd.Series(data = [1, 2, 3], index = list("ABC"))
print(s1 + 10)
# 输出
A    11
B    12
C    13
dtype: int64

print(s1 * 2)
# 输出
A    2
B    4
C    6
dtype: int64

(2)Numpy functions运算

x = np.power(s1, 3)
print(x)
# 输出
A     1
B     8
C    27
dtype: int64

(3)Series对象之间的运算

遵循索引对齐原则;如果对不齐,则补全空值,使用add/sub/mul/div函数处理空值

s1 = pd.Series(data = np.array([2, 3, 4]), index = list("ABC"))
s2 = pd.Series(data = np.array([10, 12, 15]), index = list("ABC"))
print(s1 + s2)
# 输出
A    12
B    15
C    19
dtype: int64

上面代码可能看出结果很简单,很自然,继续看下面:

s1 = pd.Series(data = np.array([2, 3, 4]), index = list("ABC"))
s2 = pd.Series(data = np.array([10, 12, 15]), index = list("BCA"))
print(s1 + s2)
# 输出
A    17
B    13
C    16
dtype: int64

上面s2的index顺序与上面不一样了,但运算依旧是按照匹配相同索引,即相同索引的内容进行运算,这才是“索引对齐”的真实含义。

下面是索引对不齐的情况:

s1 = pd.Series(data = np.array([2, 3, 4]), index = list("ABC"))
s2 = pd.Series(data = np.array([10, 12, 15]), index = list("ACD"))
print(s1 + s2)
# 输出
A    12.0
B     NaN
C    16.0
D     NaN
dtype: float64

s1中有B无D,s2中有D无B;两者都有A和C,所以相加之后索引A和C的值可以直接求

但B和D因为都涉及到空值,只要参与运算的一方是 NaN,结果就是 NaN,这是 NumPy / pandas 的统一规则

“为什么 pandas 不“偷偷帮我把缺失值当成 0”?那样看起来更方便啊?”

因为把“缺失(NaN)”当成“0”,在大多数真实数据分析中是危险且误导的。

NaN :Not a Number.即“不是一个数据,无法知晓,未定义”。

在明确知晓运算对象中存在索引缺失、对不齐的情况下,可以通过补齐的方式:

s1 = pd.Series(data = np.array([2, 3, 4]), index = list("ABC"))
s2 = pd.Series(data = np.array([10, 12, 15]), index = list("ACD"))
s1 = s1.reindex(s1.index.union(s2.index), fill_value=0)
print(s1)
# 输出
A    2
B    3
C    4
D    0
dtype: int64

s2 = s2.reindex(s1.index, fill_value=0)
print(s2)
# 输出
A    10
B     0
C    12
D    15
dtype: int64

print(s1 + s2)
# 输出
A    12
B     3
C    16
D    15
dtype: int64