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

Pandas 核心操作指南:索引、筛选、赋值与函数应用

Pandas 核心操作指南:索引、筛选、赋值与函数应用

在数据分析和数据科学领域,pandas是 Python 生态中不可或缺的库。它基于 NumPy 构建,提供了高性能的DataFrameSeries数据结构,以及丰富的数据操作接口。本文将系统介绍 pandas 中最常用、最容易出错的核心操作,包括索引选择(loc/iloc)、列操作、条件筛选、apply函数,以及如何避免常见的SettingWithCopyWarning。所有知识点均配有可运行代码示例。


1. 认识 DataFrame 与 Series

  • DataFrame:二维表格,有行索引(默认为 0,1,2…)和列名。
  • Series:一维带标签的数组。

举个例子:可以把 DataFrame 想象成一张学生成绩表

  • 行索引:学生的学号或姓名(如“张三”、“李四”)
  • 列名:科目(如“语文”、“数学”)

那么:

  • 每一列(如“数学”列)是一个 Series,它的索引就是所有学生的名字(行索引),值是对应的数学成绩。
  • 每一行(如“张三”这一行)如果单独取出来,也是一个 Series,它的索引就是科目名称(列名),值是张三各科的成绩。

代码验证

importpandasaspd# 创建成绩表 DataFrame,行索引为学生姓名df=pd.DataFrame({'语文':[85,90,78],'数学':[92,88,95],'英语':[88,85,80]},index=['张三','李四','王五'])print("成绩表 DataFrame:")print(df)

输出:

语文 数学 英语 张三 85 92 88 李四 90 88 85 王五 78 95 80

取一列(数学)→ Series

math_col=df['数学']print("\n取“数学”列:")print(math_col)print("该 Series 的索引(即学生姓名):",math_col.index.tolist())print("值:",math_col.values)

输出:

取“数学”列: 张三 92 李四 88 王五 95 Name: 数学, dtype: int64 该 Series 的索引(即学生姓名): ['张三', '李四', '王五'] 值: [92 88 95]

取一行(李四)→ Series

li_row=df.loc['李四']print("\n取“李四”这一行:")print(li_row)print("该 Series 的索引(即科目):",li_row.index.tolist())print("值:",li_row.values)

输出:

取“李四”这一行: 语文 90 数学 88 英语 85 Name: 李四, dtype: int64 该 Series 的索引(即科目): ['语文', '数学', '英语'] 值: [90 88 85]

总结

  • 列 → Series:索引 = 原 DataFrame 的行索引(学生名),值 = 该科成绩。
  • 行 → Series:索引 = 原 DataFrame 的列名(科目),值 = 该生各科成绩。

通过这个成绩表的例子,就能直观理解:无论取一列还是取一行,返回的都是 Series,只是它们的索引含义不同。


2. 数据选择:lociloc

pandas 提供了两种主要的索引方法:标签索引loc整数位置索引iloc

2.1loc:基于标签(行名/列名)

格式:df.loc[行选择, 列选择]

  • 行选择:单标签、标签列表、标签切片(包含终点)、布尔条件、可调用对象
  • 列选择:单列(字符串)、多列(列表)、列切片('col1':'col3'
# 选取单行(结果为 Series)print(df.loc['李四'])# 索引为 '李四' 的行# 选取多行(结果为 DataFrame)print(df.loc['张三':'王五'])# 行索引 张三, 李四, 王五(注意:包含终点)# 选取特定列print(df.loc[:,['语文','数学']])# 所有行,语文和数学列# 布尔条件(见第4节)print(df.loc[df['数学']>90,:])

2.2iloc:基于整数位置(0-based)

格式:df.iloc[行位置, 列位置]

  • 行/列选择:整数、整数列表、整数切片(不包含终点
# 取第二行第三列的值(行索引1,列索引2)print(df.iloc[1,2])# 李四的英语成绩 85# 取前2行,第1列和第3列(列索引0和2)print(df.iloc[0:2,[0,2]])# 行0,1;列0(语文)和2(英语)# 行切片左闭右开print(df.iloc[0:2,:])

2.3 直接使用df[]的快速方式

# 选择单列 → Seriesdf['数学']# 选择多列 → DataFramedf[['语文','数学']]# 行切片(基于位置,左闭右开,**不能同时选列**)df[0:2]# 前2行,所有列

3. 添加/删除列

3.1 添加新列

可以通过常量、列表或基于已有列计算添加。

# 常量列df['新常量']=1# 列表(长度必须匹配)df['新列表']=[100,200,300]# 基于现有列计算df['总分']=df['语文']+df['数学']+df['英语']# 使用 np.where 条件赋值importnumpyasnp df['数学优秀']=np.where(df['数学']>90,'是','否')# 使用 apply(按列逐元素)df['语文等级']=df['语文'].apply(lambdax:'优秀'ifx>=90else'良好')

3.2 批量添加列:assign

assign返回一个新的 DataFrame(不修改原对象),可以同时添加多列。

df_new=df.assign(总分=df['语文']+df['数学']+df['英语'],平均分=(df['语文']+df['数学']+df['英语'])/3)

3.3 删除列:drop

# 删除单列df_dropped=df.drop('新常量',axis=1)# 删除多列df_dropped=df.drop(['新列表','语文等级'],axis=1)# 原地删除df.drop('数学优秀',axis=1,inplace=True)

注意:inplace=True会直接修改原 DataFrame,谨慎使用。

4. 条件筛选与赋值

4.1 布尔索引筛选行

# 数学大于90的行df[df['数学']>90]# 多个条件(& 表示且,| 表示或)df[(df['数学']>90)&(df['语文']>=85)]

4.2 条件赋值

最常见的需求:根据条件给新列赋值。推荐使用loc一次性完成,避免SettingWithCopyWarning

# 正确做法:使用 locdf.loc[df['数学']>90,'数学等级']='A'df.loc[df['数学']<=90,'数学等级']='B'# 也可以使用 np.wheredf['数学等级2']=np.where(df['数学']>90,'A','B')

5. 数值运算与排序

5.1 常用数值运算

DataFrame 支持直接使用运算符(+,-,*,/等),也支持统计方法。

# 列间运算df['总分']=df['语文']+df['数学']+df['英语']# 统计描述df['数学'].mean()df['语文'].max()df[['数学','英语']].sum()# 各列求和

5.2 排序

# 按数学成绩升序排序,返回新 DataFramedf_sorted=df.sort_values('数学')# 降序df_sorted=df.sort_values('数学',ascending=False)# 多列排序df_sorted=df.sort_values(['数学','语文'],ascending=[False,True])# 原地排序df.sort_values('数学',inplace=True)

6.apply函数:灵活应用

apply是 pandas 中最强大的函数之一,可以沿 DataFrame 的轴(行或列)应用一个函数。

6.1 在 Series 上使用apply

逐元素处理:

# 提取姓名字符串长度(此处用成绩表示例,可改为其他)df['数学的十分之一']=df['数学'].apply(lambdax:x/10)# 用 lambda 定义复杂逻辑df['数学是否优秀']=df['数学'].apply(lambdax:'优秀'ifx>90else'普通')

6.2 在 DataFrame 上使用apply

axis=0(默认):将每一列作为 Series 传入函数,返回一个值或 Series。
axis=1:将每一行作为 Series 传入函数。

# axis=0:计算每列最大值与最小值的差result=df[['语文','数学','英语']].apply(lambdax:x.max()-x.min(),axis=0)print(result)# 语文、数学、英语各自的极差# axis=1:计算每行总分(其实直接用 sum 更简单,这里演示用法)defrow_sum(row):returnrow['语文']+row['数学']+row['英语']df['总分']=df.apply(row_sum,axis=1)

7. 视图与复制警告(SettingWithCopyWarning)

这是 pandas 初学者最常遇到的警告。它的本质是:对可能是视图(原数据的切片)的 DataFrame 进行赋值操作时,pandas 无法确定你是想修改原数据还是临时副本,因此发出警告。

7.1 触发警告的典型场景

# 危险的链式索引(Chained Indexing)df[df['数学']>90]['新列']=100# 会触发警告

7.2 安全做法

方法一:使用loc一次性赋值(推荐)

df.loc[df['数学']>90,'新列']=100

方法二:显式创建副本

subset=df[df['数学']>90].copy()subset['新列']=100

7.3 为什么会出现视图?

某些操作(如df[condition])返回的是原数据的一个视图(视图修改会影响原数据),某些返回的是副本。为了避免不确定性,始终使用loc进行条件赋值,或者主动.copy()

经验法则:只要看到SettingWithCopyWarning,就用loc重写赋值语句。

8. 综合示例

下面结合所有知识点,完成一个数据处理流程:

importpandasaspdimportnumpyasnp# 创建成绩表df=pd.DataFrame({'语文':[85,90,78,92],'数学':[92,88,95,89],'英语':[88,85,80,91]},index=['张三','李四','王五','赵六'])# 1. 添加总分列df['总分']=df['语文']+df['数学']+df['英语']# 2. 使用 np.where 标记数学是否优秀df['数学优秀']=np.where(df['数学']>90,'是','否')# 3. 使用 apply 计算每行平均分df['平均分']=df[['语文','数学','英语']].apply(lambdax:x.mean(),axis=1)# 4. 按总分排序(降序)df_sorted=df.sort_values('总分',ascending=False)# 5. 筛选出数学优秀且总分大于270的行high_achievers=df_sorted.loc[(df_sorted['数学优秀']=='是')&(df_sorted['总分']>270),:]# 6. 安全赋值:给这些学生加荣誉标记df.loc[high_achievers.index,'荣誉']='优秀学生'print(df)

小结

  • 认识数据结构:DataFrame 是二维表格,列是 Series(索引为行索引),行提取后也是 Series(索引为列名)。通过成绩表的例子理解行列索引的区别。
  • 索引选择
    • loc基于标签(含终点),iloc基于整数位置(不含终点)。
    • 简单场景可用df[列名]df[行切片]
  • 列操作:直接赋值、assigndrop
  • 条件筛选与赋值:布尔索引配合loc是最安全的方式,务必避免链式索引。
  • apply:Series 上逐元素处理;DataFrame 上可沿行或列应用函数。
  • 视图警告:始终使用loc[condition, col] = value或显式.copy()

掌握 pandas 的核心操作,能够高效地完成数据清洗、转换和分析。后续可以进一步学习分组聚合(groupby)、合并(merge)、透视表(pivot_table)等高级功能。建议读者跟着本文示例敲一遍代码,加深对索引和赋值的理解。

http://www.jsqmd.com/news/861613/

相关文章:

  • GGUF支持Llama-4无损量化教程
  • 2026年热门的分散印染印花助剂定制加工厂家推荐 - 品牌宣传支持者
  • 2026年临沂成人高考报名机构选择实操指南:中宏教育联系、临沂老牌函授站、临沂非脱产、国家开放大学函授站、山东学历提升选择指南 - 优质品牌商家
  • WebSocket压测实战:从协议原理到高并发稳定性验证
  • RT-Trace升级:集成GDB Server与一键烧录,打造嵌入式开发调试平台
  • PHP版本漏洞修复:从运行时依赖分析到四路径修复
  • WordPress Breeze插件RCE漏洞CVE-2026-3844深度分析与四层防护
  • JMeter接口断言实战:从响应匹配到业务逻辑校验
  • 2026宜宾道闸安装厂家怎么选:宜宾门禁道闸安装、宜宾门禁道闸批发、宜宾门禁道闸电话、广告道闸、智能道闸、栅栏道闸选择指南 - 优质品牌商家
  • 2026年现阶段,平谷区汽车内饰深度清洁与翻新服务专业指南 - 2026年企业推荐榜
  • CSS 布局与渲染性能
  • 线程池:从Executors到自定义线程池的设计权衡
  • C语言内联函数与宏的深度解析:性能、安全与工程实践
  • 从安全左移到DevSecOps:构建嵌入式系统应用程序安全(AppSec)的完整实践指南
  • 2026乐山临江鳝丝店推荐:乐山临江鳝丝哪家正宗、乐山临江鳝丝推荐品牌、乐山临江鳝丝电话、乐山临江鳝丝订餐热线选择指南 - 优质品牌商家
  • Frida启动失败根因分析:SELinux与ptrace_scope深度解析
  • C语言内联函数与宏的深度解析:选型决策与实战避坑指南
  • 2026年4月热门的冷库直销厂家推荐,保鲜库/冷冻库/冷藏库/冷库/大型冷库/防爆冷库/组合式冷库,冷库企业哪家强 - 品牌推荐师
  • RAG落地失败?别怪技术,这5个“看不见”的坑才是拦路虎!揭秘提升效率与准确率的秘诀
  • JMeter断言实战:从误配到分层校验的避坑指南
  • 八大AI智能体项目全解析-ai agent开发
  • Selenium Cookie复用登录态实战指南
  • PIC® MCU通用开发板设计:模块化硬件与跨系列开发实战
  • Midjourney后现代风格实战手册(从鲍德里亚拟像到算法戏仿):9个被官方隐藏的/blend+chaos组合技首次公开
  • 为什么你的双色调总像PPT?揭秘Midjourney v6中未公开的--tint权重衰减算法与Gamma校准阈值
  • STM32物联网开发板硬件全解析:从最小系统到传感器通信实战
  • 使用Taotoken后API调用失败率与自动重试成功率的直观改善
  • 2026年度最新主流AI论文软件综合排行
  • 嵌入式Linux环境监测系统毕业设计:从硬件选型到多线程编程实战
  • 生成式 AI 用户突破 6 亿后,AI 写作行业正从“尝鲜工具”走向“创作工作台”