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

Python关于pandas的基础知识

一.扫盲

(一)、pandas 是什么

pandas 是 Python 的一个第三方数据处理库,它提供了高效、灵活的数据结构(如 Series 和 DataFrame),能方便地对结构化数据进行清洗、转换、分析和处理。

(二)、pandas 与 NumPy 的关系

NumPy 是 Python 中用于科学计算的基础库,主要用于存储和处理数值型数组。但它有一个局限,就是不能直接存储和处理字符串等非数值类型的数据

而 pandas 是在 NumPy 的基础上构建的,它不仅继承了 NumPy 对数值型数据的处理能力,还扩展了对字符串、日期等多种数据类型的支持,能更好地应对复杂的结构化数据处理场景。

(三)、为何需要用 pandas 处理 Excel 文件

在日常办公中,Excel 文件是非常常用的数据存储和处理格式。但如果仅依靠 Excel 软件本身进行大量数据的复杂处理,效率往往较低。

这时候就需要用到 pandas,它可以轻松读取和写入 Excel 文件,并且能通过简洁的代码实现数据筛选、排序、分组、计算等操作,大幅提升数据处理效率。

(四)、哪些行业常用 Excel 且适合用 pandas

很多行业在工作中频繁使用 Excel,其中金融行业、投行尤为典型。这些行业需要对大量的财务数据、交易数据、市场数据等进行编排、统计和分析计算,借助 pandas 能快速完成复杂的数据处理任务,提高工作效率和准确性。

(五)、openpyxl 库

除了 pandas,还有一个名为openpyxl的 Python 库,它可以直接读取和写入 Excel 文件。同时,openpyxl 还能模拟 pandas 的部分功能,在一些特定场景下为 Excel 文件处理提供更多选择。

(六).安装

  1. 点击顶部菜单栏 “File”(文件)→ “Settings”(设置)(或直接按 Ctrl + Alt + S 快捷键打开设置)。
  2. 在设置左侧列表,找到并点击 “Project: [你的项目名称]” → “Python Interpreter”(Python 解释器) 。
  3. 在右侧 “Python Interpreter” 界面,点 + 号(“Add” 按钮),打开包搜索安装窗口,搜索你需要的第三方库(如 pandas numpy 等 ),再点击 “Install Package” 安装即可。

二.代码演示

(一).DataFrame

"""
DataFrame(数据框)
就是excel表(多个Series的拼接)
"""
import pandas as pddf_1 = pd.DataFrame({'age':[10,11,12],'name':['tim', 'tom', 'rose'],'income':[100,200,300]},index=['person1', 'person2', 'person3'])
print(df_1)"""
dataframe的属性
"""
#行索引
df_1.index
#列名
df_1.columns
#值
df_1.valuesdf_1 = pd.DataFrame({'age':[10,11,12],'name':['tim', 'tom', 'rose'],'income':[100,200,300]})
print(df_1)
print(df_1.name)

在这个代码里面我们可以看到在6行 pandas 数据类型是dataframe numpy的数据类型是ndnarry

 其中

df_1 = pd.DataFrame({'age':[10,11,12],'name':['tim', 'tom', 'rose'],'income':[100,200,300]},index=['person1', 'person2', 'person3'])

在DataFrame后面的数据是可以全部强制转化表格数据的类型,{ }表示的是字典的类型,如果是字典类型的话就会有键和值的概念,键值对像age:[10,11,12]在效果中展示的是下图中的样子,而代码的最后一行 index=['person1', 'person2', 'person3'])是行的索引号

#效果展示:

age这个下面的数值是竖着分布的类推左边也是一样的。

(二).DataFramed的属性

这张图需要结合效果图


"""
dataframe的属性
"""
#行索引
df_1.index
#列名
df_1.columns
#值
df_1.valuesdf_1 = pd.DataFrame({'age':[10,11,12],'name':['tim', 'tom', 'rose'],'income':[100,200,300]})
print(df_1)
print(df_1.name)

看age就是表示的是columns的列一列一列的,columns就是表示的是一列一列

values还是按照numpy的形式存储的如图所示

可以看到values里的numpy数据类型就是ndarray

 下一个知识点就是这张图片的23-25行说的就是无index的时候如下图所示行名就默认0 1 2 

df_1是类产生的对象,那就可以得到对象的属性只需要这样的代码:print(df_1.name)

三.DataFrame常见的操作

(一)代码讲解

import pandas as pddic = {'name': ['kiti', 'beta', 'peter', 'tom'],'age': [20, 18, 35, 21],'gender': ['f', 'f', 'm', 'm']}
df = pd.DataFrame(dic)
print(df)"""
根据年龄这一列,进行排序【升序和降序】
"""
df = df.sort_values(by=['age'])
df = df.sort_values(by=['age'], ascending=False)"""
值替换
"""
df['gender'] = \
df['gender'].replace(['m', 'f'], ['male', 'female'])

sort函数就是讲的是排序的这样的函数,

 下图是排序从小到大排序

ascending=False表示就是从大到小的排序。

值替换

18行的\是换行的意思,

三.serious

serious就是表达的一维的数据类型,dataframe是表达二维及以上数据类型

import pandas as pds_1 = pd.Series([1,2,3,4,5], index=['a', 'b', 'c', 'd', 'e'])s_2 = pd.Series(['lily', 'rose', 'jack'])#查
"""
(1)通过标签访问
"""
#访问某个元素
print(s_1['d'])
#访问多个元素[Series的切片]
print(s_1['a':'d'])
#访问多个元素
print(s_1[['a', 'd']])"""
(2)通过索引访问
"""
print(s_2[2])
print(s_2[0:2])
print(s_2[[0, 2]])print(s_1[4])#删除
s_1 = s_1.drop('a')
#判断一下某个值是否在Series里面
print('jim' != s_2.values)#改
s_2[0] = 'Peter'#创建Series
dic_1 = {"name1": "Peter", "name2":"tim", 
"name3":"rose"}
s_4 = pd.Series(dic_1)
print(s_4)#重置索引
s_4.index = range(0, len(s_4))
print('1')

四.serious操作

(一)标签访问

import pandas as pds_1 = pd.Series([1,2,3,4,5],index=['a', 'b', 'c', 'd', 'e'])s_2 = pd.Series(['lily', 'rose', 'jack'])#查
"""
(1)通过标签访问
"""
#访问某个元素
print(s_1['d'])
#访问多个元素[Series的切片]
print(s_1['a':'d'])
#访问多个元素
print(s_1[['a', 'd']])
  1. s_1['d']:用单个标签'd'直接访问对应元素,返回标量值 4。
  2. s_1['a':'d']:用:切片,包含起始标签'a'和结束标签'd'及中间所有元素,返回 Series。
  3. s_1[['a', 'd']]:用列表['a','d']指定多个标签,按顺序返回对应元素组成的 Series。

(二).索引

import pandas as pds_1 = pd.Series([1,2,3,4,5],index=['a', 'b', 'c', 'd', 'e'])s_2 = pd.Series(['lily', 'rose', 'jack'])#查
"""
(1)通过标签访问
"""
#访问某个元素
print(s_1['d'])
#访问多个元素[Series的切片]
print(s_1['a':'d'])
#访问多个元素
print(s_1[['a', 'd']])"""
(2)通过索引访问
"""
print(s_2[2])
print(s_2[0:2])
print(s_2[[0, 2]])print(s_1[4])#删除
s_1 = s_1.drop('a')
#判断一下某个值是否在Series里面
print('jim' != s_2.values)#改
s_2[0] = 'Peter'#创建Series
dic_1 = {"name1": "Peter", "name2":"tim",
"name3":"rose"}
s_4 = pd.Series(dic_1)
print(s_4)#重置索引
s_4.index = range(0, len(s_4))
print('1')

(1) 通过标签访问
  • print(s_1['d']):使用标签'd'直接访问s_1中对应元素,返回值为 4。
  • print(s_1['a':'d']):通过:进行标签切片,包含从'a''d'的所有元素,返回一个包含这四个元素的 Series。
  • print(s_1[['a', 'd']]):传入包含'a''d'的列表,按列表顺序返回这两个标签对应的元素,组成新的 Series。
(2) 通过索引访问
  • print(s_2[2]):使用位置索引 2 访问s_2中的元素,返回'jack'
  • print(s_2[0:2]):通过:进行位置切片,包含从索引 0 到 1(不包含 2)的元素,返回包含'lily''rose'的 Series。
  • print(s_2[[0, 2]]):传入包含 0 和 2 的列表,按顺序返回这两个位置索引对应的元素,组成新的 Series。
  • print(s_1[4]):使用位置索引 4 访问s_1中的元素,返回 5(对应标签'e'的值)。

删除

  • s_1 = s_1.drop('a'):通过drop方法删除s_1中标签为'a'的元素,原 Series 不变,需重新赋值才会更新。(很重要)

判断某个值是否在 Series 里面

  • print('jim' != s_2.values):先通过values获取s_2的所有元素值,再判断'jim'是否不等于这些值,返回一个布尔数组。

  • s_2[0] = 'Peter':通过位置索引 0 定位s_2中的元素,并将其修改为'Peter'

创建 Series

  • s_4 = pd.Series(dic_1):通过字典dic_1创建 Series,字典的键作为标签,值作为对应元素值。

重置索引

  • s_4.index = range(0, len(s_4)):将s_4的索引重置为从 0 开始的连续整数,长度与s_4的元素个数一致。

五.查询数据的两种方法

"""
loc()
iloc()
"""
import pandas as pd
import numpy as np
#生成指定日期
datas = pd.date_range('20180101', periods=5)
df = pd.DataFrame(np.arange(30).reshape(5,6),index=datas,columns=['A','B','C','D','E','F'])"""
loc()方法
df.loc[x, y]
【标签索引】
"""
#打印某个值
print(df.loc['20180103', 'B'])
#打印某列值
print(df.loc[:,'B'])
print(df.loc['20180103':,'B'])
print(df.loc['20180103':,['B', 'D']])
#打印某行值
print(df.loc['20180101', :])
#打印某些行
print(df.loc['20180103':,:])"""
iloc()方法
位置索引
"""
#获取某个数据
print(df.iloc[1,2])
#获取某列
print(df.iloc[:,2])
#获取某几列
print(df.iloc[:,[1,3]])
#获取某行
print(df.iloc[1,:])
#获取某些行
print(df.iloc[[1,2,4],:])

一、数据准备:生成日期索引与 DataFrame

  1. 日期索引生成(datas = pd.date_range(...)
    pd.date_range('20180101', periods=5) 用于生成一组连续的日期索引,结果是DatetimeIndex类型(调试时可看到是 datetime 格式)。这里从20180101(2018 年 1 月 1 日)开始,生成 5 个连续日期,即:2018-01-012018-01-022018-01-032018-01-042018-01-05

  2. 创建 DataFrame(df = pd.DataFrame(...)
    这行代码将生成一个 5 行 6 列的二维表格数据,各参数含义:

    • np.arange(30):生成 0 到 29 的连续整数(共 30 个数字),作为表格的原始数据;
    • reshape(5,6):将 30 个数字转换成 5 行 6 列的二维数组(5 行 ×6 列 = 30 个元素);
    • index=datas:指定表格的行索引(行名) 为前面生成的 5 个日期;
    • columns=['A','B','C','D','E','F']:指定表格的列索引(列名) 为 A 到 F 这 6 个标签。

    最终生成的df是一个二维 DataFrame 对象,结构如下(简化):

    行名(index)ABCDEF
    2018-01-01012345
    2018-01-0267891011
    .....................

二、查询方法:loc()—— 基于标签的索引

loc()是 pandas 中基于标签(行名 / 列名) 的查询方法,语法为df.loc[行标签, 列标签],适用于二维 DataFrame 的查询(区别于一维 Series 的查询,Series 是单维度数据,而 DataFrame 是二维表格,需要同时指定行和列的标签)。

代码中各示例的含义:

  1. df.loc['20180103', 'B']
    查询行标签为20180103(2018 年 1 月 3 日)、列标签为B的单个值。

  2. df.loc[:,'B']
    查询所有行:表示全部)、列标签为B的整列数据(返回一个 Series)。

  3. df.loc['20180103':,'B']
    查询行标签从20180103到最后一行('20180103':表示从该标签开始的所有行)、列标签为B的数据。

  4. df.loc['20180103':,['B', 'D']]
    查询行标签从20180103到最后一行、列标签为BD的两列数据(返回一个子 DataFrame)。

  5. df.loc['20180101', :]
    查询行标签为20180101所有列:表示全部)的整行数据(返回一个 Series)。

  6. df.loc['20180103':,:]
    查询行标签从20180103到最后一行、所有列的子 DataFrame。

三、查询方法:iloc()—— 基于位置的索引

iloc()是 pandas 中基于位置(整数索引) 的查询方法,语法为df.iloc[行位置, 列位置],其中 “位置” 从 0 开始计数(即第 1 行是位置 0,第 1 列是位置 0)。它适用于不记得行 / 列标签,只知道具体位置的场景。

代码中各示例的含义:

  1. df.iloc[1,2]
    查询第 2 行(位置 1)、第 3 列(位置 2)的单个值(因为索引从 0 开始)。

  2. df.iloc[:,2]
    查询所有行:表示全部)、第 3 列(位置 2)的整列数据。

  3. df.iloc[:,[1,3]]
    查询所有行、第 2 列(位置 1)和第 4 列(位置 3)的两列数据。

  4. df.iloc[1,:]
    查询第 2 行(位置 1)、所有列的整行数据。

  5. df.iloc[[1,2,4],:]
    查询第 2 行(位置 1)、第 3 行(位置 2)、第 5 行(位置 4)、所有列的数据。

六.简单的Dataframe操作

import pandas as pddf = pd.DataFrame({'age':[10,11,12],'name':['tim', 'tom', 'rose'],'income':[100,200,300]},index=['person1', 'person2', 'person3'])
print(df)"""
修改列名
"""
a= df.columns
df.columns = range(0, len(df.columns))
print(df.columns)"""
修改行名
"""
print(df.index)
df.index = range(0,len(df.index))
print(df.index)"""
增加一列
"""
#在最后添加一列
df['pay'] = [20, 30, 40]
print(df)"""
增加一行
"""
df.loc['person4', ['age', 'name', 'income']] = [20, 'kitty', 200]
print(df)
"""
访问DataFrame
"""
#访问某列
print(df.name)
#访问某些列
print(df[['age', 'name']])#访问行
print(df[0:2])
# #使用loc访问
print(df.loc[['person1', 'person3']])
#访问某个值
print(df.loc['person1', 'name'])"""
删除
"""
#直接在原数据上删除
del df['age']
print(df)
#删除列
data = df.drop('name', axis=1, inplace=False)
print(data)
#删除行
df.drop('person3', axis=0, inplace=True)import pandas as pd
import numpy as npdatas = pd.date_range('20180101',periods=5)
df1 = pd.DataFrame(np.arange(30).reshape(5,6),index=datas,columns=['A','B','C','D','E','F'])
print(df1)
print()

一、修改列名

代码中先通过a = df.columns获取了当前 DataFrame 的列名(此时列名为['age', 'name', 'income']),随后通过df.columns = range(0, len(df.columns))对列名进行了修改。
这里利用range(0, len(df.columns))生成了从 0 开始、与列数相同长度的连续整数(因原 DataFrame 有 3 列,所以生成[0, 1, 2]),最终将列名修改为这组整数。执行后df.columns的输出结果为Int64Index([0, 1, 2], dtype='int64')

二、修改行名

与修改列名逻辑类似,先通过print(df.index)查看当前行索引(原行名为['person1', 'person2', 'person3']),再通过df.index = range(0, len(df.index))重新设置行名。
range(0, len(df.index))生成了与行数相同的连续整数(原 DataFrame 有 3 行,生成[0, 1, 2]),最终行名被修改为这组整数。执行后df.index的输出结果为RangeIndex(start=0, stop=3, step=1)

三、增加一列

代码中通过df['pay'] = [20, 30, 40]在 DataFrame 最后新增了一列,列名为'pay',对应的值为[20, 30, 40]
注意:这行代码(第 28 行)非常重要。在后期涉及深度学习等场景时,经常需要为数据新增特征列(如标签、计算得到的特征等),这种直接通过列名赋值新增列的方式是基础且常用的操作,需要认真学习并记忆。

四、访问 DataFrame

代码从第 39 行开始演示了访问 DataFrame 的多种方式:

  1. 访问某列print(df.name)通过 “点语法” 访问名为'name'的列(前提是列名符合变量命名规则)。
  2. 访问某些列print(df[['age', 'name']])通过传入列名列表['age', 'name'],一次性访问多个指定列,返回包含这些列的子 DataFrame。
  3. 访问行(切片方式)print(df[0:2])通过切片0:2访问前 2 行(左闭右开,即索引为 0 和 1 的行)。
  4. 通过 loc 访问行print(df.loc[['person1', 'person3']])通过loc方法,传入行名列表['person1', 'person3'],精准访问指定行。
  5. 访问某个具体值print(df.loc['person1', 'name'])通过loc方法,传入行名'person1'和列名'name',直接获取对应位置的具体值(此处为'tim')。

五、删除操作

从第 55 行开始演示了 DataFrame 的删除操作,这在数据清洗中非常重要:

  1. 直接删除列del df['age']通过del关键字直接删除'age'列,操作会直接修改原 DataFrame。
  2. 通过 drop 删除列data = df.drop('name', axis=1, inplace=False)使用drop方法删除列。其中axis=1表示删除列(axis=0表示删除行),inplace=False表示不修改原 DataFrame,而是返回删除后的新 DataFrame(赋值给data)。
  3. 通过 drop 删除行df.drop('person3', axis=0, inplace=True)使用drop方法删除行。axis=0表示删除行,inplace=True表示直接在原 DataFrame 上进行修改,删除行名为'person3'的行。
http://www.xdnf.cn/news/16191.html

相关文章:

  • Springboot和postman的使用
  • torchvision.transforms 与 MONAI 数据增强的异同
  • 华为视觉算法面试30问全景精解
  • 网易视觉算法面试30问全景精解
  • C++ 模板库map数据结构的概念和使用案例
  • 板凳-------Mysql cookbook学习 (十二--------5)
  • 鸿蒙卡片开发保姆级教程
  • Java 线程池详解:从原理到实战,彻底掌握并发编程核心组件
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现水下鱼类识别(C#代码,UI界面版)
  • 【机器学习深度学习】微调量化与模型导出量化:区分与应用
  • 数字护网:一次深刻的企业安全体系灵魂演练
  • JavaScript 03 严格检查模式Strict字符串类型详解
  • 论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes
  • Python机器学习:从零基础到项目实战
  • Netty中AbstractReferenceCountedByteBuf对AtomicIntegerFieldUpdater的使用
  • GRU模型
  • Linux操作系统之线程(六):线程互斥
  • SpringMVC快速入门之核心配置详解
  • 第十二章 用Java实现JVM之结束
  • 网络基础15-16:MSTP +VRRP综合实验
  • linux 环境服务发生文件句柄泄漏导致服务不可用
  • 基于网络爬虫的在线医疗咨询数据爬取与医疗服务分析系统,技术采用django+朴素贝叶斯算法+boostrap+echart可视化
  • CS231n-2017 Lecture5卷积神经网络笔记
  • 【世纪龙科技】电动汽车原理与构造-汽车专业数字课程资源
  • 33、基于JDK17的GC调优策略
  • haproxy七层均衡
  • CanOpen--SDO 数据帧分析
  • Hugging Face 模型的缓存和直接下载有什么区别?
  • 【C++】第十八节—一文万字详解 | map和set的使用
  • 7.22 Java基础 | I/O流【下】