提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在数字化时代,数据已成为决策的核心驱动力,数据分析能力也成为职场必备技能。pandas 作为 Python 生态中专为数据分析设计的核心库,基于 NumPy 构建,提供了高效的数据结构(Series 与 DataFrame)和丰富的数据分析工具,能够轻松应对数据读取、清洗、转换、统计与合并等一系列任务。
无论是机器学习的数据预处理、业务数据的趋势分析,还是学术研究中的数据整理,pandas 都以其简洁的语法、强大的功能和高效的性能,成为数据从业者的首选工具。本文将从基础概念出发,循序渐进地讲解 pandas 的核心用法,结合具体代码示例,帮助读者快速掌握从数据加载到数据合并的全流程操作,为后续的深度数据分析或机器学习工作打下坚实基础。
一、pandas是什么?
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
pandas is an open source, BSD-licensed library providing high-performance, easy-to-use data structures and data analysis tools for the Python programming language.
二、核心数据类型
1.引入库
代码如下(示例):
import pandas as pd
数据类型有Series(一维,带标签数组)和DataFrame(二维,series容器)
2.Series
series是带有标签的数组,可以使用index指定标签(标签必须是与数据的长度相同),也可以使用字典。
代码如下(示例):
import pandas as pd
t1=pd.Series([1,13,41,14,12,41])
print(t1)
print(type(t1))
t2=pd.Series([1,13,41,14,12,41],index=['a','b','c','d'])
print(t2)
输出如下:
0 1
1 13
2 41
3 14
4 12
5 41
dtype: int64
<class 'pandas.core.series.Series'>
a 1
b 13
c 41
d 14
dtype: int64
修改数据类型和numpy中相同。
3.DataFrame
DataFrame 是 pandas 库中用于表示二维表格型数据的数据结构,你可以把它想象成一个带行和列标签的二维数组。它既有行索引(index,0轴),也有列索引(columns,1轴),每一列可以是不同的数据类型(如整数、字符串、浮点数)。
代码如下:
import pandas as pd
import numpy as np
t1=pd.DataFrame(np.arange(12).reshape(3,4))
print(t1)
t2=pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['w','x','y','z'])
print(t2)
输出如下:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
w x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
三、数据索引与切片
1.Series 的索引与切片
Series 的索引与切片就是通过位置索引和标签索引,从 Series 中选取单个元素、多个元素或连续区间元素的操作。
代码如下:
import string
import pandas as pd
a={string.ascii_uppercase[i]:i+1 for i in range(10)} #字典推导式创建字典
a=pd.Series(a)
print(a)
print()
# 标签索引(用loc)
print(a.loc['A'])
print(a.loc['D'])
print()
# 位置索引(用iloc)
print(a.iloc[0])
print(a.iloc[3])
print()
# 布尔索引
print(a>4)
print()
#切片
print(a[:3]) #取前三行
print(a.iloc[[1,3]])
print(a[['A','C','E']])
print(a[a>4]) #布尔索引
输出如下:
A 1
B 2
C 3
D 4
E 5
F 6
G 7
H 8
I 9
J 10
dtype: int64
1
4
1
4
A False
B False
C False
D False
E True
F True
G True
H True
I True
J True
dtype: bool
A 1
B 2
C 3
dtype: int64
B 2
D 4
dtype: int64
A 1
C 3
E 5
dtype: int64
E 5
F 6
G 7
H 8
I 9
J 10
dtype: int64
2.DataFrame 的索引与切片
DataFrame 的索引与切片是提取数据的核心操作,主要分为基于标签的索引(loc[ ])、基于位置的索引(iloc[ ])和布尔索引三类
代码如下:
import pandas as pd
import numpy as np
t=pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['w','x','y','z'])
print(t)
# 标签索引
print(t.loc['a','z'])
print(t.loc['a'])
print(t.loc[:,'z'])
print(t.loc['a':'c',['w','z']]) #右端能取到
# 位置索引
print(t.iloc[1,:])
print(t.iloc[:,2])
print(t.iloc[:,[2,1]])
print(t.iloc[[0,2],[1,2]])
print(t.iloc[0:2,1:2]) #右端不能取到
# 布尔索引
print((t>=5)&(t<8)) # 且& 或| 不同条件之间需要用括号
print(t[t>=5])
输出如下:
w x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
3
w 0
x 1
y 2
z 3
Name: a, dtype: int64
a 3
b 7
c 11
Name: z, dtype: int64
w z
a 0 3
b 4 7
c 8 11
w 4
x 5
y 6
z 7
Name: b, dtype: int64
a 2
b 6
c 10
Name: y, dtype: int64
y x
a 2 1
b 6 5
c 10 9
x y
a 1 2
c 9 10
x
a 1
b 5
w x y z
a False False False False
b False True True True
c False False False False
w x y z
a NaN NaN NaN NaN
b NaN 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
四、数据查看与基础属性
1.Series 的索引和值
Series 由两部分核心构成:
1.索引(Index):即 Series 的 “标签”,用于标识每个元素的位置,可自定义(显式索引)或使用默认整数序列(隐式索引),本质是一个pd.Index对象。
2.值(Values):即 Series 存储的实际数据,通常是 numpy 数组(ndarray)或类似数组的结构,支持向量化运算。
两者是一一对应的映射关系:索引 → 值。
代码如下:
import string
import pandas as pd
a={string.ascii_uppercase[i]:i+1 for i in range(10)} #字典推导式创建字典
a=pd.Series(a)
print(a)
print()
# 获取完整索引对象
print(a.index)
print(type(a.index))
print(len(a.index))
# 索引转列表
print(list(a.index))
# 获取值的数组(ndarray类型)
print(a.values)
print(type(a.values))
# 获取值的基本统计信息
print(a.values.mean())
print(a.values.max())
输出如下:
A 1
B 2
C 3
D 4
E 5
F 6
G 7
H 8
I 9
J 10
dtype: int64
Index(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'], dtype='object')
<class 'pandas.core.indexes.base.Index'>
10
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
[ 1 2 3 4 5 6 7 8 9 10]
<class 'numpy.ndarray'>
5.5
10
ndarray中很多方法可以运用于Series(where不同)
2.DataFrame的属性和方法
代码如下:
import pandas as pd
import numpy as np
t=pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['W','x','y','z'])
print(t)
# 快速查看数据基础信息
print(t.shape) #形状
print(t.dtypes) #数据类型
print(t.ndim) #数据维度
print(t.columns) #列索引
print(t.index) #行索引
print(t.values) #对象值
print()
# 补充
print("总元素个数:", t.size)
print("列名:", t.columns.tolist())
print("是否为空表:", t.empty)
输出如下:
W x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
(3, 4)
W int64
x int64
y int64
z int64
dtype: object
2
Index(['W', 'x', 'y', 'z'], dtype='object')
Index(['a', 'b', 'c'], dtype='object')
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
总元素个数: 12
列名: ['W', 'x', 'y', 'z']
是否为空表: False
3.数据预览与统计摘要
数据查看与预览方法这类方法用于快速了解数据内容,避免直接查看全量数据导致的效率低下
代码如下:
import pandas as pd
import numpy as np
t=pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['W','x','y','z'])
print(t)
print(t.head(2)) #显示头几行,默认5行
print(t.tail(1)) #显示尾几行,默认5行
print(t.info()) #展示概览,包括行数、列数、列索引,非空值数量、数据类型、内存占用
print()
print(t.describe()) #生成数值型列的统计摘要(计数、均值、标准差、最值、分位数等)
输出如下:
W x y z
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
W x y z
a 0 1 2 3
b 4 5 6 7
W x y z
c 8 9 10 11
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, a to c
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 W 3 non-null int64
1 x 3 non-null int64
2 y 3 non-null int64
3 z 3 non-null int64
dtypes: int64(4)
memory usage: 120.0+ bytes
None
W x y z
count 3.0 3.0 3.0 3.0
mean 4.0 5.0 6.0 7.0
std 4.0 4.0 4.0 4.0
min 0.0 1.0 2.0 3.0
25% 2.0 3.0 4.0 5.0
50% 4.0 5.0 6.0 7.0
75% 6.0 7.0 8.0 9.0
max 8.0 9.0 10.0 11.0
排序
t.sort_values(by,ascending=False)
五、外部数据读取
代码如下:
lr=pd.read_csv('LR.csv')
六、缺失数据处理
pandas 兼容 np.nan,还引入 pd.NA(专门的缺失值类型),支持整数、布尔、字符串等类型的缺失值,且不会强制转换数据类型。pandas 的统计函数(如 mean()/sum())默认自动跳过 NaN,无需额外函数,且可通过 skipna 参数控制。
判断是否为NaN:pd.isna(),pd.notna()
针对 NaN 缺失数据的具体处理策略,包括删除、填充等常用方法
代码如下:
import pandas as pd
import numpy as np
t=pd.DataFrame(np.arange(12).reshape(3,4),index=['a','b','c'],columns=['w','x','y','z'])
t=t[t>=5]
print(t)
print()
print(pd.isna(t))
print()
# 删除法
print(t.dropna(axis=0,how='any'))
print()
print(t.dropna(axis=0,how='all'))
print()
# 填充法
print(t.fillna(0))
print()
print(t.fillna(t.mean()))
输出如下:
w x y z
a NaN NaN NaN NaN
b NaN 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
w x y z
a True True True True
b True False False False
c False False False False
w x y z
c 8.0 9.0 10.0 11.0
w x y z
b NaN 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
w x y z
a 0.0 0.0 0.0 0.0
b 0.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
w x y z
a 8.0 7.0 8.0 9.0
b 8.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
w x y z
a 8.0 7.0 8.0 9.0
b 8.0 5.0 6.0 7.0
c 8.0 9.0 10.0 11.0
七、数据合并
pandas 主要通过 concat()、merge()、join() 三种方式实现数据合并。
df1.join(df2) 是按行索引对齐的横向合并,以df1为准。行索引必须一致。
代码如下:
import pandas as pd
import numpy as np
t1=pd.DataFrame(np.ones((2,4)),index=['A','B'],columns=list('abcd'))
t2=pd.DataFrame(np.zeros((3,3)),index=['A','B','C'],columns=list('xyz'))
print(t1.join(t2))
print(t2.join(t1))
输出如下:
a b c d x y z
A 1.0 1.0 1.0 1.0 0.0 0.0 0.0
B 1.0 1.0 1.0 1.0 0.0 0.0 0.0
x y z a b c d
A 0.0 0.0 0.0 1.0 1.0 1.0 1.0
B 0.0 0.0 0.0 1.0 1.0 1.0 1.0
C 0.0 0.0 0.0 NaN NaN NaN NaN
pd.merge() 是按指定 列(键) 匹配合并,模拟 SQL 的内连接、外连接等操作,是处理关系型数据的核心方法。
代码如下:
import pandas as pd
df_student = pd.DataFrame({
"学号": [101, 102, 103, 104],
"姓名": ["张三", "李四", "王五", "赵六"]
})
df_score = pd.DataFrame({
"学号": [101, 102, 105, 106],
"数学": [90, 85, 92, 78]
})
# 内连接(取两表匹配的交集)
df_merge_inner = df_student.merge(df_score,on="学号",how="inner")
print("内连接:\n", df_merge_inner)
# 外连接(取两表的并集,缺失补 NaN)
df_merge_outer = df_student.merge(df_score,on="学号",how="outer")
print("\n外连接:\n", df_merge_outer)
# 左连接(保留左表所有行,右表无匹配则补NaN)
df_merge_left = df_student.merge(df_score,on="学号",how="left")
print("\n左连接:\n", df_merge_left)
# 左连接(保留右表所有行,左表无匹配则补NaN)
df_merge_right = df_student.merge(df_score,on="学号",how="right")
print("\n左连接:\n", df_merge_right)
# 列名不同时的连接(如左表是“学生ID”,右表是“学号”)
df_student2 = df_student.rename(columns={"学号": "学生ID"})
df_merge_diff = pd.merge(df_student2,df_score,left_on="学生ID",right_on="学号",how="outer")
print("\n列名不同的外连接:\n", df_merge_diff)
输出如下:
内连接:
学号 姓名 数学
0 101 张三 90
1 102 李四 85
内连接:
学号 姓名 数学
0 101 张三 90.0
1 102 李四 85.0
2 103 王五 NaN
3 104 赵六 NaN
4 105 NaN 92.0
5 106 NaN 78.0
左连接:
学号 姓名 数学
0 101 张三 90.0
1 102 李四 85.0
2 103 王五 NaN
3 104 赵六 NaN
左连接:
学号 姓名 数学
0 101 张三 90
1 102 李四 85
2 105 NaN 92
3 106 NaN 78
列名不同的外连接:
学生ID 姓名 学号 数学
0 101.0 张三 101.0 90.0
1 102.0 李四 102.0 85.0
2 103.0 王五 NaN NaN
3 104.0 赵六 NaN NaN
4 NaN NaN 105.0 92.0
5 NaN NaN 106.0 78.0
总结
本文系统梳理了 pandas 数据分析的核心知识点,从基础概念到实操应用,逐步展开了 Series 和 DataFrame 两种核心数据类型的定义、属性与用法,详细讲解了索引与切片的操作逻辑(包括标签索引、位置索引和布尔索引),并覆盖了外部数据读取、缺失数据处理及数据合并等关键流程。
pandas 的优势在于将复杂的数据操作封装为简洁的 API,无论是数据筛选、缺失值填充,还是多表关联合并,都能通过少量代码高效完成。文中的代码示例均经过实操验证,读者可直接复用或根据实际需求调整,快速应用于自身的数据分析场景。
需要注意的是,本文仅为 pandas 的入门与核心用法总结,其功能远不止于此。在实际应用中,pandas 还可与 Matplotlib、Seaborn 等可视化库结合实现数据可视化,或与 Scikit-learn 等机器学习库联动完成数据预处理。建议读者在掌握基础用法后,结合具体业务场景进行深度实践,探索分组统计、数据透视表、时间序列分析等进阶功能,充分发挥 pandas 在数据分析中的强大作用。
2076

被折叠的 条评论
为什么被折叠?



