当前位置: 首页 > news >正文

Pandas第二章 基础

一.文件的读取和写入

1.文件读取

(1)基础读取方法

pandas 支持读取csv、excel、txt三类常见文件,对应核心函数如下:

文件类型读取函数示例代码
CSVpd.read_csv()
df_csv = pd.read_csv('../data/my_csv.csv')
Excelpd.read_excel()
df_excel = pd.read_excel('../data/my_excel.xlsx')
TXTpd.read_table()
df_txt = pd.read_table('../data/my_table.txt')

(2)常用公共参数(三类函数通用)

这些参数可以在read_csv/read_excel/read_table中混用,用于精细化控制读取行为:

参数名作用示例
header=None不将文件第一行作为列名,自动生成数字列名
pd.read_table('../data/my_table.txt', header=None)
index_col指定一列或多列作为 DataFrame 索引
pd.read_csv('../data/my_csv.csv', index_col=['col1', 'col2'])
usecols仅读取指定列集合,减少内存占用
pd.read_table('../data/my_table.txt', usecols=['col1', 'col2'])
parse_dates将指定列解析为 datetime 时间类型
pd.read_csv('../data/my_csv.csv', parse_dates=['col5'])
nrows仅读取前 N 行数据,适合预览大文件
pd.read_excel('../data/my_excel.xlsx', nrows=2)

(3)TXT 文件特殊分隔符处理

read_table默认以空白字符为分隔符,若 TXT 使用自定义分隔符(如||||),需通过sep参数指定:

  • 注意sep是正则表达式参数,特殊字符(如|)需要转义为\\|
  • 必须指定引擎:使用多字符分隔符时,需添加engine='python'避免报错
# 读取以 |||| 分隔的 TXT 文件 pd.read_table( '../data/my_table_special_sep.txt', sep='\\|\\|\\|\\|', engine='python' )

注:

  1. 读取大文件时,优先用usecolsnrows减少数据加载量
  2. 时间列务必用parse_dates提前解析,避免后续类型转换麻烦
  3. 自定义分隔符的 TXT 文件,记得对|等特殊字符做正则转义,并指定engine='python'

2.基础文件写入

(1)基础写入方法

pandas 中 DataFrame 写入文件的核心操作,强烈建议设置index=False,避免无意义的索引列被写入文件:

目标文件类型写入函数示例代码
CSVdf.to_csv()
df_csv.to_csv('../data/my_csv_saved.csv', index=False)
Exceldf.to_excel()
df_excel.to_excel('../data/my_excel_saved.xlsx', index=False)
TXTdf.to_csv()实现
df_txt.to_csv('../data/my_txt_saved.txt', sep='\t', index=False)

注意:pandas 没有to_table()函数,TXT 文件需通过to_csv()+ 自定义分隔符实现,常用制表符\t作为分隔。

(2)格式转换输出(Markdown / LaTeX)

如果需要将表格快速转换为文档格式,可使用以下函数(需先安装tabulate包):

目标格式转换函数示例代码
Markdowndf.to_markdown()
print(df_csv.to_markdown())
LaTeXdf.to_latex()
print(df_csv.to_latex())

输出效果示例:

  • Markdown 格式

    | | col1 | col2 | col3 | col4 | col5 | |----|--------|--------|--------|---------|-----------| | 0 | 2 | a | 1.4 | apple | 2020/1/1 | | 1 | 3 | b | 3.4 | banana | 2020/1/2 | | 2 | 6 | c | 2.5 | orange | 2020/1/5 | | 3 | 5 | d | 3.2 | lemon | 2020/1/7 |
  • LaTeX 格式

    \begin{tabular}{lr lr ll} \toprule {} & col1 & col2 & col3 & col4 & col5 \\ \midrule 0 & 2 & a & 1.4 & apple & 2020/1/1 \\ 1 & 3 & b & 3.4 & banana & 2020/1/2 \\ 2 & 6 & c & 2.5 & orange & 2020/1/5 \\ 3 & 5 & d & 3.2 & lemon & 2020/1/7 \\ \bottomrule \end{tabular}

注:

  1. 索引控制index=False是写入文件的最佳实践,可避免生成冗余索引列。
  2. TXT 分隔符:写入 TXT 时,sep参数可自定义(如sep=','sep='|'),需与读取时的分隔符保持一致。

二.基本数据结构

1.Series(一维数据结构)

(1)基本概念

Series 是 pandas 中存储一维数据的核心结构,由 4 个部分组成:

  • data:序列的值
  • index:索引(可自定义名称,默认为空)
  • dtype:数据存储类型
  • name:序列本身的名字
import pandas as pd s = pd.Series( data = [100, 'a', {'dic1':5}], index = pd.Index(['id1', 20, 'third'], name='my_idx'), dtype = 'object', name = 'my_name' )

(2)核心属性获取

属性作用示例代码
s.values获取序列值数组
array([100, 'a', {'dic1': 5}], dtype=object)
s.index获取索引对象
Index(['id1', 20, 'third'], dtype='object', name='my_idx')
s.dtype获取数据类型
dtype('O')(object 类型)
s.name获取序列名称'my_name'
s.shape获取序列长度(n,)

object 类型说明:代表混合类型,可存储整数、字符串、字典等不同 Python 对象;纯字符串序列也默认是 object 类型,也可使用string类型存储。

2.DataFrame(二维数据结构)

DataFrame 是在 Series 基础上增加了列索引,用于存储二维表格数据,由二维数据 + 行索引 + 列索引构成。

(1) 两种常见创建方式

  • 方式 1:二维列表 + 行列索引
data = [[1, 'a', 1.2], [2, 'b', 2.2], [3, 'c', 3.2]] df = pd.DataFrame( data = data, index = ['row_%d'%i for i in range(3)], columns=['col_0', 'col_1', 'col_2'] )
  • 方式 2:字典映射(更常用)
df = pd.DataFrame( data = { 'col_0': [1,2,3], 'col_1': list('abc'), 'col_2': [1.2, 2.2, 3.2] }, index = ['row_%d'%i for i in range(3)] )

(2)列选取

选取方式语法返回结果
选取单列df['col_0']Series
选取多列df[['col_0', 'col_1']]DataFrame

(3)核心属性获取

属性作用示例代码
df.values获取二维数据数组
array([[1, 'a', 1.2], [2, 'b', 2.2], [3, 'c', 3.2]], dtype=object)
df.index获取行索引
Index(['row_0', 'row_1', 'row_2'], dtype='object')
df.columns获取列索引
Index(['col_0', 'col_1', 'col_2'], dtype='object')
df.dtypes获取各列数据类型(返回 Series)
col_0: int64, col_1: object, col_2: float64
df.shape获取行列数(3, 3)
df.T转置 DataFrame(行变列、列变行)行列互换后的新 DataFrame

联系:DataFrame 的每一列本质上都是一个 Series,列与列之间可以是不同数据类型。

三.常用基本函数

1.汇总函数head()/tail()

函数作用示例默认值
df.head(n)返回前ndf.head(2)→ 返回前 2 行n=5
df.tail(n)返回后ndf.tail(3)→ 返回后 3 行n=5

用途:快速查看数据格式、字段和样本,避免加载全量数据。

2.信息概览函数info()

df.info()用于查看数据集基础结构信息

  • 数据类型:<class 'pandas.core.frame.DataFrame'>
  • 行数:RangeIndex: 200 entries, 0 to 199(共 200 行)
  • 列信息:列名、非空值数量、数据类型
  • 内存占用:memory usage: 11.1+ KB

3.统计描述函数describe()

df.describe()仅对数值型列生成统计量:

统计量含义
count非空样本数
mean均值
std标准差
min最小值
25%/50%/75%下四分位数 / 中位数 / 上四分位数
max最大值

注:

  1. head()/tail()适合快速预览,info()适合检查缺失值和数据类型,describe()适合快速了解数值分布。
  2. 若需对文本 / 分类列做统计,可使用df.describe(include='object')
  3. 大数据集场景下,info()describe()是轻量高效的探索工具。

四.特征统计函数

1.基础统计函数

针对数值型列,pandas 提供了常用的聚合统计函数,操作后返回标量或 Series:

函数含义示例代码示例结果
sum()求和df_demo.sum()Height: 29869.0, Weight: 10397.0
mean()均值df_demo.mean()Height: 163.218033, Weight: 55.015873
median()中位数df_demo.median()Height: 161.9, Weight: 51.0
var()方差df_demo.var()Height: 74.046, Weight: 164.446
std()标准差df_demo.std()Height: 8.608879, Weight: 12.824294
max()最大值df_demo.max()Height: 193.9, Weight: 89.0
min()最小值df_demo.min()Height: 145.4, Weight: 34.0

2.进阶统计函数

函数含义示例代码示例结果
quantile(q)分位数(q 为 0~1 之间的数)df_demo.quantile(0.75)Height: 167.5, Weight: 65.0
count()非缺失值个数df_demo.count()Height: 183, Weight: 189
idxmax()最大值对应的索引df_demo.idxmax()Height: 193, Weight: 2
idxmin()最小值对应的索引df_demo.idxmin()-

3.聚合方向参数axis

所有聚合函数都有axis参数,用于控制聚合方向:

  • axis=0(默认):逐列聚合,对每一列计算统计量
  • axis=1逐行聚合,对每一行计算统计量
# 逐行求均值(示例:身高+体重的均值,无实际业务意义,仅演示语法) df_demo.mean(axis=1).head()

输出:

0 102.45 1 118.25 2 138.95 3 41.00 4 124.00 dtype: float64
注:
  1. 聚合函数定义:操作后返回标量(或按列 / 行聚合的 Series),因此也叫聚合函数。
  2. 缺失值处理count()会自动忽略缺失值,统计非空样本数量;mean()/sum()等也默认忽略缺失值计算。
  3. 业务场景提示:逐行聚合(axis=1)需结合业务逻辑使用,比如本数据集中 “身高 + 体重的均值” 无实际意义,仅用于语法演示。
  4. 快速查看多列统计量:df[['Height','Weight']].describe()
  5. 同时计算多个统计量:df_demo.agg(['mean','max','count'])
  6. 对不同列应用不同统计量:df_demo.agg({'Height':'mean','Weight':'max'})

五.唯一值操作

1.单列组合

针对单个 Series(列),常用函数如下:

函数作用示例代码示例结果
unique()返回所有唯一值组成的数组df['School'].unique()['Shanghai Jiao Tong University', 'Peking University', 'Fudan University', 'Tsinghua University']
nunique()返回唯一值的个数df['School'].nunique()4
value_counts()返回唯一值及其出现频次df['School'].value_counts()Tsinghua University: 69, Shanghai Jiao Tong University: 57, ...
drop_duplicates()去重,保留唯一值df['School'].drop_duplicates()保留 4 个不同学校名称
duplicated()返回布尔序列,标记重复行df['School'].duplicated().head()[False, False, True, False, True]

2.多列组合

(1)drop_duplicates()

  • 作用:按指定列组合去重,保留符合条件的行
  • 关键参数keep
    • first(默认):保留每个组合第一次出现的行
    • last:保留每个组合最后一次出现的行
    • False:剔除所有重复组合,只保留出现一次的组合
  • 示例:
    # 按 Gender + Transfer 组合去重,保留第一次出现 df_demo.drop_duplicates(['Gender', 'Transfer']) # 按 Gender + Transfer 组合去重,保留最后一次出现 df_demo.drop_duplicates(['Gender', 'Transfer'], keep='last') # 只保留 Name + Gender 组合出现一次的行 df_demo.drop_duplicates(['Name', 'Gender'], keep=False)

(2)duplicated()

  • 作用:返回布尔序列,标记重复行(重复为True,首次出现为False
  • drop_duplicates()的关系:drop_duplicates()等价于删除duplicated()True的行
  • 示例:
    df_demo.duplicated(['Gender', 'Transfer']).head() # 输出:0 False, 1 False, 2 True, 3 True, 4 True

(3)核心区别与联系

函数输入输出典型用途
unique()Series数组查看类别取值
nunique()Series标量统计类别数量
value_counts()SeriesSeries统计类别分布
drop_duplicates()Series/DataFrameSeries/DataFrame去重、保留唯一组合
duplicated()Series/DataFrame布尔 Series标记重复行、筛选重复数据

注:

  1. value_counts()默认按频次降序排列,可加sort=False保持原顺序
  2. drop_duplicates()可作用于整个 DataFrame,默认按所有列组合去重
  3. duplicated()可配合~取反,筛选不重复行:df[~df.duplicated()]

六.替换函数

1.映射替换:replace

replace是最基础的映射替换方法,支持字典或列表两种映射方式:

写法示例代码说明
字典映射
df['Gender'].replace({'Female':0, 'Male':1})
键为原值,值为替换后的值
列表映射
df['Gender'].replace(['Female','Male'], [0,1])
两个列表一一对应,按顺序替换

方向替换(method 参数)

  • method='ffill':用前面最近的未被替换值填充
  • method='bfill':用后面最近的未被替换值填充
s = pd.Series(['a', 1, 'b', 2, 1, 1, 'a']) s.replace([1, 2], method='ffill') # 用前面的 a/b 替换 1/2 s.replace([1, 2], method='bfill') # 用后面的 a/b 替换 1/2

注:正则替换建议使用str.replace,当前版本replace对 string 类型正则替换存在 bug。

2.逻辑替换:where&mask

wheremask是完全对称的逻辑替换函数:

  • where(condition)条件为 False 的行被替换(默认替换为 NaN)
  • mask(condition)条件为 True 的行被替换(默认替换为 NaN)
函数示例代码结果说明
wheres.where(s<0)保留负数,非负数变为 NaN
wheres.where(s<0, 100)保留负数,非负数替换为 100
masks.mask(s<0)负数变为 NaN,非负数保留
masks.mask(s<0, -50)负数替换为 -50,非负数保留

条件可以是自定义布尔序列,只要索引与原 Series 一致即可:

s_condition = pd.Series([True,False,False,True], index=s.index) s.mask(s_condition, -50) # 按自定义布尔序列替换

3.数值替换:round/abs/clip

针对数值型数据的专用替换函数:

函数作用示例代码结果
round(n)四舍五入到 n 位小数s.round(2)1.2345 → 1.23
abs()取绝对值s.abs()-1 → 1-50 → 50
clip(lower, upper)截断到 [lower, upper] 区间s.clip(0, 2)-1 → 0100 → 2

4.三类替换函数对比

类别核心函数典型场景
映射替换replace类别型变量编码(如性别→0/1)、批量值映射
逻辑替换where/mask按条件筛选并替换(如异常值修正)
数值替换round/abs/clip数值精度处理、范围截断、符号转换

七.排序函数

1.值排序:sort_values

按数据列的值进行排序,支持单列 / 多列排序、升序 / 降序控制。

(1)基础用法(单列排序)

# 按身高升序排序(默认 ascending=True) df_demo.sort_values('Height').head() # 按身高降序排序 df_demo.sort_values('Height', ascending=False).head()
  • ascending=True(默认):升序(从小到大)
  • ascending=False:降序(从大到小)

(2)多列排序

按多列组合排序,需为每一列指定排序方向:

# 体重升序,体重相同时身高降序 df_demo.sort_values( by=['Weight', 'Height'], ascending=[True, False] ).head()
  • by:排序列名列表,按列表顺序依次排序
  • ascending:布尔列表,与by一一对应,分别控制每一列的排序方向

2.索引排序:sort_index

按索引(行 / 列索引)进行排序,支持多级索引,用法与sort_values完全一致。

(1)基础用法(多级索引排序)

# 按 Grade 升序、Name 降序排序多级索引 df_demo.sort_index( level=['Grade', 'Name'], ascending=[True, False] ).head()
  • level:指定索引层(可传索引名或层号)
  • ascending:布尔列表,与level一一对应,控制每一层索引的排序方向
  • 字符串索引按字母顺序排序

3.对比

函数排序对象核心参数典型场景
sort_values数据列by(列名)、ascending按数值 / 类别列排序(如身高、体重排序)
sort_index索引level(索引层)、ascending按行 / 列索引排序(如多级索引分类排序)

注:

  1. 多级索引sort_index可通过level指定索引层,实现多级索引的灵活排序
  2. 排序稳定性:pandas 排序默认稳定,相同值的行保持原相对顺序
  3. 缺失值处理sort_values默认将 NaN 放在排序结果末尾(可通过na_position调整)
  • 快速查看排序结果:配合.head()预览前几行
  • 多列排序时,ascending列表长度必须与by列表长度一致
  • 索引排序对字符串列按字母顺序,如需自定义顺序可使用Categorical

八.apply方法

apply是 pandas 中用于行 / 列迭代的灵活方法,支持传入自定义函数,实现对 DataFrame 的列迭代或行迭代。

1.核心原理

  • axis参数控制迭代方向,与聚合函数完全一致:
    • axis=0(默认):列迭代,每次传入一列(Series)
    • axis=1行迭代,每次传入一行(Series)
  • 传入的函数以 ** 序列(Series)** 为输入,返回标量或序列,最终聚合为结果。

2.示例

(1)自定义函数实现均值计算

df_demo = df[['Height', 'Weight']] # 方式1:定义普通函数 def my_mean(x): return x.mean() df_demo.apply(my_mean) # 方式2:lambda 表达式简化 df_demo.apply(lambda x: x.mean()) #Height 163.218033 Weight 55.015873 dtype: float64

(2)行迭代(逐行计算均值)

df_demo.apply(lambda x: x.mean(), axis=1).head() ### 0 102.45 1 118.25 2 138.95 3 41.00 4 124.00 dtype: float64 ###

3.自定义统计量mad

mad(平均绝对偏差)的计算公式:

序列中每个元素与均值的绝对偏差的平均值

# 用 apply 实现 mad df_demo.apply(lambda x: (x - x.mean()).abs().mean()) # 等价于 pandas 内置 mad 函数 df_demo.mad() # Height 6.707229 Weight 10.391870 dtype: float64 #

注:

  1. 性能警告apply自由度高,但性能远低于 pandas 内置函数。仅在无内置函数可替代的自定义场景下使用。
  2. 迭代对象axis=0传入列,axis=1传入行,需根据需求选择。
  3. lambda 简化:简单逻辑优先用 lambda 表达式,复杂逻辑用普通函数。

九.窗口对象

1.滑动窗口rolling

(1)基础用法

  • 核心作用:对序列按固定窗口大小做滑动计算
  • 核心参数:window(窗口大小),axis(默认 0,列方向)
s = pd.Series([1,2,3,4,5]) roller = s.rolling(window=3) # 创建窗口大小为3的滑窗对象

(2) 常用聚合计算

滑窗对象支持所有聚合函数,窗口包含当前行元素:

函数作用示例结果(window=3)
mean()滑动均值[NaN, NaN, 2.0, 3.0, 4.0]
sum()滑动求和[NaN, NaN, 6.0, 9.0, 12.0]
cov(s2)滑动协方差两序列窗口内协方差
corr(s2)滑动相关系数两序列窗口内相关系数

(3)自定义函数apply

支持传入自定义函数,输入为窗口内的 Series:

# 等价于 roller.mean() roller.apply(lambda x: x.mean())

2.类滑窗函数shift/diff/pct_change

这类函数公共参数为periods=n(默认 1),支持正负 n(反方向操作):

函数作用示例(s = [1,3,6,10,15])
shift(n)取向前第 n 个元素的值shift(2)[NaN, NaN, 1, 3, 6]
diff(n)与向前第 n 个元素做差(n 阶差分)diff(3)[NaN, NaN, NaN, 9, 12]
pct_change(n)与向前第 n 个元素相比计算增长率pct_change()[NaN, 2.0, 1.0, 0.666..., 0.5]

(1)反方向操作(n 为负)

  • shift(-1):取向后第 1 个元素 →[3,6,10,15,NaN]
  • diff(-2):与向后第 2 个元素做差 →[-5, -7, -9, NaN, NaN]

(2)等价滑窗实现

类滑窗函数可通过rolling等价实现:

# shift(2) 等价于 rolling(3) 取窗口第一个元素 s.rolling(3).apply(lambda x: list(x)[0]) # diff(3) 等价于 rolling(4) 取首尾元素差 s.rolling(4).apply(lambda x: list(x)[-1]-list(x)[0]) # pct_change() 等价于 rolling(2) 计算增长率 def my_pct(x): L = list(x) return L[-1]/L[0]-1 s.rolling(2).apply(my_pct)

3. 扩张窗口(累计窗口)expanding

(1)核心原理

扩张窗口(又称累计窗口)是动态长度的窗口:

  • 窗口范围:从序列起始位置到当前位置,窗口长度随位置逐步扩张
  • 示例:序列[a1, a2, a3, a4]对应窗口为[a1][a1,a2][a1,a2,a3][a1,a2,a3,a4]
  • 本质:对序列做累计聚合计算,等价于rolling(window=当前位置+1)的特殊滑动窗口

(2)用法示例

s = pd.Series([1, 3, 6, 10]) # 创建扩张窗口对象,计算累计均值 s.expanding().mean()

计算过程拆解:

位置窗口范围计算结果
0[1]1/11.0
1[1,3](1+3)/22.0
2[1,3,6](1+3+6)/33.333333
3[1,3,6,10](1+3+6+10)/45.0

(3)常用聚合函数

扩张窗口支持所有 pandas 聚合函数,与rolling完全一致:

  • 基础统计:mean()sum()median()max()min()
  • 离散统计:count()quantile()
  • 自定义函数:apply(lambda x: ...)

注:

  1. 窗口计算规则:滑动窗口包含当前行元素,如第 4 个位置计算均值为(2+3+4)/3,而非(1+2+3)/3
  2. 缺失值处理:窗口不足时默认返回 NaN
  3. 性能提示:优先使用内置聚合函数,apply仅用于自定义场景
  4. 后续内容:日期偏置窗口、指数加权窗口将在后续章节讲解
  5. 扩张窗口可理解为窗口大小无限扩张的滑动窗口,expanding()等价于rolling(window=len(s), min_periods=1)
  6. 支持axis参数,可对 DataFrame 做列 / 行方向的累计聚合
http://www.cnnetsun.cn/news/1560788.html

相关文章:

  • openGauss数据库设计实战:PowerDesigner E-R建模与正向工程全解析
  • 离散状态观测器
  • 安装ROS2,亲测有效
  • FlashAI:推动AI技术民主化的零门槛部署方案
  • Display Driver Uninstaller完整使用指南:彻底解决显卡驱动问题的终极方案 [特殊字符]
  • 5分钟解锁联想拯救者BIOS隐藏选项:终极免费工具完全指南
  • 使用PyInstaller打包yz-女生-角色扮演-造相Z-Turbo模型为可执行文件
  • 小程序毕业设计基于微信小程序的桃李园速修系统
  • ENSP实战:从零构建企业级WLAN网络
  • 从键盘到单片机:编码器(如74LS147)在嵌入式系统里到底怎么用?一个实例讲透
  • 从CAJ到PDF:解密学术文献格式转换的魔法工具
  • OpenClaw模型量化实践:nanobot镜像8bit压缩Qwen3-4B效果对比
  • Snippet Box:重新定义你的个人代码知识库管理体验
  • 2026年物流托盘工厂揭秘:智能生产如何重塑供应链新格局
  • Android动态分区空间管理实战:从源码配置到终端查询
  • Reachy Mini:开源桌面机器人的完整指南与核心技术解析
  • Learn Claude Code Agent 开发 | 2、插拔式工具系统:扩展功能不修改核心循环
  • 小产后吃什么恢复快?科学修护助力身体回归健康
  • 小程序毕业设计基于微信小程序的生日福利管理系统
  • Windows Cleaner:终极免费解决方案,5分钟彻底解决C盘爆红问题
  • 搜维尔科技:捕捉·训练·扩展·Xsens人形机器人解决方案
  • 高效掌握Mermaid零代码图表工具实战指南:3大核心场景+5个进阶技巧
  • LeaguePrank:英雄联盟个性化展示的安全合规解决方案
  • Qwen2.5-1.5B本地化AI助手效果:实时纠错‘我昨天去北京了’→‘我昨天去了北京’语法修正
  • Qwen3.5-4B-Claude-Opus惊艳效果展示:复杂逻辑题的结构化分析输出
  • PyKitti实战指南:多传感器数据处理如何解决自动驾驶开发者的数据解析痛点
  • Pydoll:无WebDriver的Chromium自动化解决方案
  • Pycharm+PyInstaller实战:5分钟搞定Python项目打包成exe(Windows专属)
  • Presenton:本地AI驱动的演示创作革新工具
  • Directory Opus 13 右键菜单集成 TortoiseGit 全攻略(附常用命令大全)