数据分析(pandas)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

在数字化时代,数据已成为决策的核心驱动力,数据分析能力也成为职场必备技能。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 在数据分析中的强大作用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值