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

驯龙日记:用Pandas驾驭数据的野性

 引言:为什么选择Pandas?

"NumPy是手术刀,Pandas是急救箱"

  • 手术刀(NumPy):精密的数值计算

  • 急救箱(Pandas):处理现实数据的全套工具

维度NumPy数组Pandas Series优势对比
索引系统纯数字位置索引支持标签+位置双索引数据定位效率提升300%
数据类型强制统一类型智能推断混合类型真实数据兼容性更佳
对齐机制无自动对齐基于标签自动对齐数据合并错误率降低80%
元数据仅存储数值支持名称/类型等属性数据自解释性更强

一、🛠️ 环境配置与基础操作

1.1 安装指南 

# Windows/Mac通用安装命令
pip install pandas# Mac系统备用命令
pip3 install pandas

1.2 标准导入方式

import pandas as pd  # 行业标准简写

二、🚀 Series核心操作全解析

Series:类似一维数组,但支持自定义索引和标签,与 NumPy 数组的区别:

  • 输出时显示索引(默认从 0 开始,可自定义)。

  • 支持标签索引(非仅位置索引)。

2.1 三种创建方式

import pandas as pd# 基础创建
s1 = pd.Series([2,4,6,8,10])# 自定义索引
s2 = pd.Series([5,3,9], index=['A','B','C'])# 字典转换
data_dict = {'北京':2154, '上海':2428, '广州':1876}
s3 = pd.Series(data_dict)

2.2 属性操作速查表

操作类型代码示例输出示例
查看数值s2.values[28,31,33]
查看索引s2.indexIndex(['北京','上海','广州'])
获取形状s2.shape(3,)
统计描述s2.describe()展示count/mean/std等统计量
设置名称s2.name = '气温'增强数据可解释性

2.3 索引黑科技:位置vs标签双模式 

    使用整数作为索引标签时,易因索引逻辑混乱引发错误:取值操作(如 s[1])优先按标签匹配,而切片操作(如 s[1:3])默认按位置范围截取,这种不一致性可能导致意外结果。

  • 解决关键:Pandas 提供 loc 和 iloc 强制隔离两种索引模式,消除歧义。

索引方式对比矩阵

索引类型访问方法切片包含规则典型应用场景
位置索引s.iloc[]左闭右开顺序访问数据
标签索引s.loc[]左闭右闭按特征值精准定位
操作场景位置索引标签索引混合索引风险
单元素访问s.iloc[2] → 深圳气温s.loc['上海'] → 31整数标签易引发歧义
范围切片s.iloc[1:3] → 上海到广州s.loc['上海':'广州'] → 含结束值索引类型强制转换问题
布尔索引s[s > 30] → 筛选高温城市支持复杂条件组合注意运算符优先级

高级索引技巧

# 多维度筛选(注意括号使用)
high_temp = s2[(s2 > 30) & (s2.index.str.contains('海'))]# 动态索引更新
s2.loc['杭州'] = 29  # 安全新增条目
s2.iloc[1] = 32     # 精准修改上海气温# 存在性检查优化
if '深圳' in s3.index: s3.fillna(30, inplace=True)  # 处理缺失值

2.4 练习

答案

写出导入pandas的语句,并且给pandas别名为pd。

import pandas as pd

创建一个叫s1的Series,里面包含元素-1.2、3.7、2.5、-8.2、6.3。创建后进行输出。

s1 = pd.Series([-1.2, 3.7, 2.5, -8.2, 6.3])
s1

打印s1的所有索引以及所有元素值。

print(s1.index)
print(s1.values)

创建一个叫s2的Series,里面包含元素1、2、3、4、5,并且对应索引5、4、3、2、1。创建后进行输出。

s2 = pd.Series([1, 2, 3, 4, 5], index=[5, 4, 3, 2, 1])
s2

输出s2里按位置顺序排在第2个的元素。

s2.iloc[1]

输出s2里按标签对应从5到3(包括3)范围内的元素。

s2.loc[5:3]

通过一个字典来创建Series s3。字典的键为:小李、小陈、小张、小曾、小邓,值为82、93、91、78、68。创建后进行输出。

s3 = pd.Series({"小李": 82, "小陈": 93, "小张": 91, "小曾": 78, "小邓": 68})
s3

把s3里小张标签对应的值改为95,再输出s3。

s3.loc["小张"] = 95
s3

输出s3里所有值大于80且小于90的元素。

s3[(s3 > 80) & (s3 < 90)]

三、Pandas Series高级操作指南

3.1 Series 算术运算

当两个 Series 相遇,Pandas 会自动充当 “数据翻译官”,按标签(索引)精准配对计算

核心规则:只有索引 “撞衫”(同时存在)的数据才会计算,落单的索引结果为 NaN(“找不到搭档,暂时空缺”)。

    # 示例:s1 有索引 [0,1,3],s2 有索引 [0,2,3]
    s1 = pd.Series([10, 20, 30], index=[0, 1, 3])  
    s2 = pd.Series([5, 15, 25], index=[0, 2, 3])  
    print(s1 + s2)  
    # 输出:
    # 0    15.0   (0号索引配对,10+5=15)
    # 1     NaN   (1号索引在s2中找不到,空缺)
    # 2     NaN   (2号索引在s1中找不到,空缺)
    # 3    55.0   (3号索引配对,30+25=55)

    缺失值救星:fill_value 参数
    不想看到 NaN?用 方法调用(如 add())代替符号运算,给 “落单者” 一个默认值(比如 0):

    print(s1.add(s2, fill_value=0))  # 给找不到的索引补0再计算  
    # 输出:
    # 0    15.0   (0号正常计算)
    # 1    20.0   (s2中没有1号,用0代替,20+0=20)
    # 2     15.0   (s1中没有2号,用0代替,0+15=15)
    # 3    55.0   (3号正常计算)

    类比:就像两个班级按学号分组做游戏,学号(索引)一样的同学才能组队,没有学号的同学就派一个 “替补队员”(默认值)上场。

    四则运算方法对照表
    运算符等效方法参数说明
    +.add()fill_value=默认值
    -.sub()
    *.mul()
    /.div()
    **.pow()

     3.2 统计分析:describe() 魔法

    想快速了解 Series 的 “健康状况”?describe() 一键生成 “数据体检报告”:

    scores = pd.Series([85, 90, 70, 65, 80, 95])  
    print(scores.describe())  
    指标含义(人话版)示例输出
    count数据个数(有多少个有效数字)6.0
    mean平均值(所有数加起来除以个数)82.5
    std标准差(数据波动幅度,越大越分散)10.897
    min最小值(最小的数)65.0
    25%第 25 百分位数(前 25% 数据的分界线)70.0
    50%中位数(中间的数,排序后第 3、4 名的平均)82.5
    75%第 75 百分位数(后 25% 数据的分界线)90.0
    max最大值(最大的数)95.0

    对比 NumPy:NumPy 数组需要分别调用 max()mean() 等函数,而 Pandas 的 describe() 直接 “打包输出”,效率翻倍!

    3.3 元素级操作:

    如果每个数据都需要 “私人定制”(比如成绩转等级、数据清洗),apply() 就是你的 “智能流水线”:

    (1)定义 “加工规则”(函数) 

    def score_to_grade(score):  if score >= 90:  return 'A'  # 优秀  elif 80 <= score < 90:  return 'B'  # 良好  elif 70 <= score < 80:  return 'C'  # 中等  else:  return 'D'  # 加油哦  

    (2)批量加工,生成新 Series

    grades = scores.apply(score_to_grade)  
    print(grades)  
    # 输出:0    B, 1    A, 2    C, 3    D, 4    B, 5    A (每个成绩都被“翻译”成等级)

    (3)偷懒技巧:用 lambda 快速写简单规则

    # 给所有成绩加5分(广播机制+apply)  
    new_scores = scores.apply(lambda x: x + 5)  

    3.4 广播机制:让单个数字 “感染” 所有元素

    当一个数字(如 5)遇到 Series,Pandas 会自动让这个数字 “感染” 每个元素,逐个运算:

    s = pd.Series([1, 2, 3])  
    print(s * 3)  # 等价于每个元素 ×3,输出:0    3, 1    6, 2    9  

    类比:就像给全班同学每人发 3 本书,不需要逐个通知,一句 “每人 3 本” 就能让所有人收到。

    3.5 核心知识点速查表

    场景方法 / 机制核心作用示例代码
    带默认值的运算s1.add(s2, fill_value=0)索引不对齐时用默认值填充再计算s1.add(s2, fill_value=0)
    快速统计数据describe()生成数据的多维度统计报告scores.describe()
    自定义元素处理apply(函数)对每个元素应用自定义逻辑,返回新 Seriesgrades = scores.apply(score_to_grade)
    单个数字批量运算广播机制自动对每个元素执行相同操作s * 2 或 s + 5

    相关文章:

  • 在AWS Glue中实现缓慢变化维度(SCD)的三种类型
  • 深圳市富力达:SAP一体化管理助力精密制造升级 | 工博科技SAP客户案例
  • 织梦dedecms网站如何修改上一篇下一篇的标题字数
  • 【Flutter】Flutter + Unity 插件结构与通信接口封装
  • 光场的相位与偏振
  • 详解 Unreal Engine(虚幻引擎)
  • 开源网络入侵检测与防御系统:Snort
  • Spark SQL开发实战:从IDEA环境搭建到UDF/UDAF自定义函数实现
  • Maven下载aspose依赖失败的解决方法
  • BeeWorks Meet更适合企业内部使用的原因
  • Linux中线程池的简单实现 -- 线程安全的日志模块,策略模式,线程池的封装设计,单例模式,饿汉式单例模式,懒汉式单例模式
  • streamlit实现非原生的按钮触发效果 + flask实现带信息的按钮触发
  • 前端浏览器窗口交互完全指南:从基础操作到高级控制
  • 论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断
  • [计算机科学#3]:布尔逻辑 (计算机数学基础)
  • 【中级软件设计师】编译和解释程序的翻译阶段、符号表 (附软考真题)
  • Lua 第10部分 模式匹配
  • 【嵌入式八股22】排序算法与哈希算法
  • 辞九门回忆
  • windows安装docker,发现没有hyper
  • 诗词文赋俱当歌,听一听古诗词中的音乐性
  • 人社部:就业政策储备充足,将会根据形势变化及时推出
  • 加总理:目前没有针对加拿大人的“活跃威胁”
  • 商务部:将打造一批国际消费集聚区和入境消费友好商圈
  • 视频丨伊朗阿巴斯港一处油罐发生高强度爆炸:造成大面积破坏,伤亡不明
  • 涉李小龙形象商标被判定无效,真功夫:暂无更换计划