【Python从入门到进阶】60、Pandas中DataFrame对象的操作(一)

news2024/12/25 9:04:18

接上篇《59、Pandas库中Series对象的操作(二)》
上一篇我们讲解了Series对象的运算、函数应用、时间序列操作,以及Series的案例实践。本篇我们来讲解Pandas中DataFrame对象的操作。

一、DataFrame对象的基本概念及特点

在Pandas库中,DataFrame是一种非常重要的数据结构,它以一种表格的形式存储和操作结构化数据。DataFrame对象不仅继承了NumPy数组的强大功能,还提供了更为丰富的数据操作接口,使得数据分析工作变得既高效又便捷。

1、基本概念

DataFrame是Pandas中的一个二维、大小可变、异构的表格型数据结构,具有标记的轴(行和列)。你可以将其想象成一个Excel表格,其中包含了行和列,每列可以是不同的数据类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,这使得数据的检索和操作变得非常灵活。

2、特点

(1)异构性:DataFrame的列可以是不同的数据类型,这是与NumPy数组的主要区别之一。NumPy数组要求所有元素的数据类型必须相同,而DataFrame则没有这个限制。
(2)标签化的轴:DataFrame的轴可以被视为行和列的标签(或索引)。这使得用户可以通过标签来选择数据,而不仅仅是位置。
(3)丰富的操作接口:Pandas为DataFrame提供了大量的方法,用于数据的清洗、转换、聚合、分组以及可视化等操作。这些方法极大地简化了数据分析的流程。
(4)高效的数据处理能力:DataFrame底层使用NumPy库,因此继承了NumPy的高效性能。同时,Pandas还通过内部优化,使得大数据量的处理变得更加迅速和高效。
(5)集成性:Pandas库与Python的其他数据分析和可视化库(如Matplotlib、Seaborn、SciPy等)有着良好的集成性。用户可以方便地将DataFrame对象与这些库结合使用,进行更复杂的数据分析和可视化工作。
(6)易于理解:DataFrame的表格型结构使得数据更加直观和易于理解。对于熟悉Excel等表格软件的用户来说,DataFrame的使用门槛相对较低。

3、应用场景

DataFrame在数据分析、数据挖掘、机器学习等多个领域都有着广泛的应用。无论是处理CSV文件、Excel文件还是SQL数据库中的数据,DataFrame都能提供强大的支持。通过DataFrame,用户可以轻松地进行数据清洗、转换、聚合等操作,为后续的数据分析和建模工作打下坚实的基础。

综上所述,DataFrame是Pandas库中一个非常重要且强大的数据结构,它以其独特的特点和丰富的操作接口,在数据分析领域发挥着不可替代的作用。

二、DataFrame的创建

在Pandas中,DataFrame的创建方式多种多样,可以基于多种数据源来构建。以下详细介绍了几种常见的创建DataFrame的方法。

1、从字典创建DataFrame

(1)使用pd.DataFrame()函数

从字典创建DataFrame是Pandas中最直接的方式之一。字典的键将被用作DataFrame的列名,而字典的值(通常是列表或NumPy数组)则作为列的数据。

import pandas as pd

# 创建一个字典
data = {
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 28, 34],
    '性别': ['男', '女', '男']
}

# 使用pd.DataFrame()函数创建DataFrame
df = pd.DataFrame(data)

print(df)

效果:

(2)设定列索引和行索引

在创建DataFrame时,还可以指定列索引和行索引。如果数据本身包含了一个可以被用作索引的列(如ID),可以在创建DataFrame后设置其为索引。

# 设定行索引  
index = ['ID001', 'ID002', 'ID003']  
df = pd.DataFrame(data, index=index)  
  
# 查看结果  
print(df)  
  
# 如果数据中有可以作为索引的列,可以在创建后设置  
df.set_index('Name', inplace=True)  
print(df)

效果:

注:在Pandas库中,inplace=True是一个参数,它经常出现在修改DataFrame或Series对象的方法中。这个参数的作用是控制修改是否直接在原对象上进行,还是返回一个新的对象。

2、从CSV文件创建DataFrame

(1)使用pd.read_csv()函数

CSV(逗号分隔值)文件是数据分析中常用的数据格式之一。Pandas提供了read_csv()函数来方便地从CSV文件中读取数据并创建DataFrame。
首先我们创建一个csv文件,打开一个记事本,输入下面的内容:

然后保存后,将txt格式直接修改为csv格式,打开看一下效果(用wps打开):

读取代码:

import pandas as pd

# 使用pd.read_csv()读取CSV文件  
df = pd.read_csv('data.csv')  
  
# 查看前几行数据  
print(df.head())

效果:

(2)处理文件路径、分隔符、编码等参数

read_csv()函数提供了多个参数来处理不同格式的CSV文件,如filepath_or_buffer用于指定文件路径,sep或delimiter用于指定字段分隔符(默认为逗号,),encoding用于指定文件编码(如'utf-8')。

# 指定文件路径、分隔符和编码  
df = pd.read_csv('data.csv', sep=';', encoding='utf-8')  
  
# 查看数据  
print(df)

效果:

这里出现这种结果,是因为我们用的是“,”号进行数据列分割,而用“;”分割的话,所有列都被识别为一列了,因为没有“;”符号可分割

3、从其他数据源创建DataFrame(可选)

Pandas不仅支持从字典和CSV文件创建DataFrame,还支持从其他多种数据源读取数据,如Excel文件、SQL数据库等。

(1)Excel文件

按照原来的数据,准备一个xlsx(csv在wps中另存为xlsx):

使用pd.read_excel()函数可以从Excel文件中读取数据。

# 从Excel文件读取数据(先安装openpyxl库)
df = pd.read_excel('data.xlsx', sheet_name='data')  
  
# 查看数据  
print(df)

效果:

(2)SQL数据库

要使用Pandas从SQL数据库读取数据,你通常需要先安装并配置数据库连接库(如sqlite3、pymysql、psycopg2等),然后使用pd.read_sql_query()或pd.read_sql_table()等函数。
这里我们将之前测试SQLite的db数据库,拷贝到测试代码所在的文件夹下,进行连接测试:

import sqlite3
import pandas as pd

# 连接到SQLite数据库
conn = sqlite3.connect("test.db")

# 从数据库中读取数据
query_sql = "select * from users"
df = pd.read_sql_query(query_sql, conn)

# 关闭连接
conn.close()

# 查看数据
print(df)

效果:

注意:以上SQL数据库示例使用的是SQLite,对于其他类型的数据库(如MySQL、PostgreSQL等),你需要安装相应的Python库并修改连接字符串。

三、DataFrame的基本操作

1、查看DataFrame信息

在Pandas中,DataFrame是处理表格数据的主要数据结构,它提供了多种方法来查看数据的基本信息,以便于数据的分析和处理。

● 使用head(), tail()方法

head(n)方法默认返回DataFrame的前5行数据,n参数可以指定返回的行数。这对于快速查看数据的开始部分非常有用。

import pandas as pd  
  
# 假设df是我们从上个xlsx文件中读取的DataFrame  
df = pd.read_excel('data.xlsx')  
  
# 查看前3行数据  
print(df.head(3))

效果:

tail(n)方法则与head()相反,它默认返回DataFrame的最后5行数据,n参数同样可以指定返回的行数。

# 查看最后2行数据  
print(df.tail(2))

效果:

● 使用info(), describe()方法

info()方法提供了DataFrame的简洁摘要,包括列名、每列的非空值数量、数据类型等信息。

# 查看DataFrame的详细信息  
print(df.info())

效果:

describe()方法提供了数值列的统计汇总,包括计数、平均值、标准差、最小值、四分位数和最大值等。对于非数值列,则提供计数、唯一值数量、众数等统计信息。

# 查看数值列的统计信息  
print(df.describe())

效果:

2、索引和切片

在Pandas中,索引是访问DataFrame行和列的关键。

● 使用行标签和列标签进行索引

可以直接通过列名访问单列数据,这会返回一个Series对象。

# 访问'姓名'列  
print(df['姓名'])

效果:

通过行标签(索引)访问单行数据,需要结合.loc[]或.iloc[]。

● 使用.loc[]和.iloc[]进行定位

.loc[]基于标签的索引器,可以接收行标签和列标签的切片器、布尔数组、可调用对象或标签列表。

# 使用.loc[]访问第一行和'姓名', '年龄'列  
print(df.loc[0, ['姓名', '年龄']])  
  
# 访问'姓名'列中索引为0到2的行  
print(df.loc[0:2, '姓名'])

效果:

.iloc[]基于位置的索引器,主要用于通过整数位置选择数据。

# 使用.iloc[]访问前两行和前两列  
print(df.iloc[:2, :2])

效果:

3、选择数据

Pandas提供了灵活的方式来选择DataFrame中的特定数据。

● 选择单列或多列

如前所述,可以通过列名直接选择单列或多列。

● 选择多行或多列的数据子集

使用.loc[]或.iloc[]结合条件表达式或切片来选择多行多列的数据子集。

# 使用.loc[]选择'年龄'大于25的行和所有列  
print(df.loc[df['年龄'] > 25])  

效果:

● 使用布尔索引

布尔索引是一种强大的选择数据的方法,它允许你根据条件来选择满足特定条件的行。

# 选择'年龄'大于25的所有行  
mask = df['年龄'] > 25  
print(df[mask])  
  
# 或者直接在一个表达式中完成  
print(df[df['年龄'] > 25])

效果:

以上便是DataFrame基本操作的概述,结合实例数据可以更直观地理解和应用这些方法。

四、DataFrame的数据清洗

1、处理缺失值

● 检测缺失值

首先,我们需要检测DataFrame中的缺失值。Pandas提供了isnull()或isna()方法来检测缺失值,返回一个与原DataFrame形状相同的布尔型DataFrame,其中缺失值用True表示。

import pandas as pd  
  
# 创建一个包含不同类型数据和缺失值的DataFrame  
data = {  
    '编号': [1, 2, 3, 4, 5, 6],  
    '姓名': ['张三', '李四', '王五', '赵六', '孙七', '张三'],  # 重复值  
    '年龄': [25, 30, np.nan, 22, 35, 25],  # 缺失值  
    '薪资': [50000, 60000, 70000, 80000, np.nan, 50000],  # 缺失值  
    '入职日期': ['2020-01-01', '2021-02-15', '2022-03-01', '2021-04-15', '2020-05-01', '2020-01-01'],  # 日期时间字符串  
    '类别': ['A', 'B', 'A', 'C', np.nan, 'A']  # 分类数据,包含缺失值  
}  

# 将数据字典转换为DataFrame  
df = pd.DataFrame(data)  

# 检测缺失值  
missing_values = df.isnull()  
print(missing_values.head())  # 查看前几行的缺失值情况  
  
# 统计每列缺失值的数量  
missing_counts = missing_values.sum()  
print(missing_counts)

效果:

● 删除含有缺失值的行或列

根据需求,我们可以选择删除含有缺失值的行或列。通常,删除列的做法比较谨慎,因为列往往代表数据的一个重要维度。

# 删除含有缺失值的行  
df_dropped_rows = df.dropna(axis=0)  # axis=0表示行  
print(df_dropped_rows.shape)  # 查看删除后的形状  
  
# 删除含有缺失值的列(慎用)  
df_dropped_cols = df.dropna(axis=1, how='any')  # how='any'表示只要列中有缺失值就删除  
print(df_dropped_cols.shape)

效果:

● 填充缺失值

对于数值型数据,常用均值、中位数或众数来填充缺失值。对于分类数据,可以使用众数或特定值(如"Unknown")来填充。

# 使用均值填充数值型缺失值
print('【使用均值填充数值型缺失值】')
age_mean = df['年龄'].mean()
df['年龄'] = df['年龄'].fillna(age_mean)
print(df)

# 使用中位数填充
print('【使用中位数填充数值型缺失值】')
age_median = df['薪资'].median()
df['薪资'] = df['薪资'].fillna(age_median)
print(df)

# 对于分类数据,使用众数填充(需要额外计算众数)
print('【使用众数填充分类型缺失值】')
mode_val = df['类别'].mode()[0]
df['类别'] = df['类别'].fillna(mode_val)
print(df)

# 使用固定值填充
# df['某字段'].fillna('Unknown', inplace=True)
# print(df)

效果:

2、数据类型转换

● 使用astype()方法进行数据类型转换

astype()方法允许我们将DataFrame中的列转换为指定的数据类型。

# 将字符串类型的列转换为整数类型  
df['int_column'] = df['str_int_column'].astype(int)  
  
# 注意:转换时可能会遇到无法转换的值,这时可以设置errors参数为'ignore'或'coerce'  
# df['int_column'] = df['str_int_column'].astype(int, errors='coerce')  # 'coerce'会将无法转换的值转换为NaN  
  
# 转换失败时的另一种处理方式是先清洗数据
● 转换日期时间类型

Pandas提供了pd.to_datetime()函数来将字符串或其他类型的数据转换为日期时间类型。

# 假设'date_str_column'是包含日期时间字符串的列  
df['date_column'] = pd.to_datetime(df['date_str_column'])  
  
# 查看转换后的数据类型  
print(df['date_column'].dtype)

3、重复值处理

● 检测重复值

duplicated()方法用于检测DataFrame中的重复值,返回一个布尔型Series,表示每行是否是重复行(第一次出现的重复行返回False,之后的重复行返回True)。

# 检测重复值,排除“编号”列
# 使用subset参数来指定除了哪些列之外的其他列都用于检测重复值
duplicates = df.duplicated(subset=df.columns.difference(['编号']))
print('【检测重复值】')
print(duplicates)

# 查看重复值的总数
print('【查看重复值的总数】')
print(duplicates.sum())

效果:

● 删除重复值

drop_duplicates()方法用于删除重复值,返回一个新的DataFrame,其中删除了指定的重复行。

# 删除所有重复的行,保留第一次出现的行
print('【删除所有重复的行,保留第一次出现的行】')
df_no_duplicates = df.drop_duplicates(subset=df.columns.difference(['编号']))

# 或者,指定子集来检测重复值
df_no_duplicates_subset = df.drop_duplicates(subset=['姓名', '年龄', '类别'])

# 查看结果
print(df_no_duplicates.shape)

效果:

至此,我们完成了DataFrame对象的简介、基本操作及数据清洗相关的内容。下一篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/140418261

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1925898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Python+Django+MySQL的心理咨询预约系统

心理咨询预约系统 DjangoMySQL 基于PythonDjangoMySQL的心理咨询预约系统 项目主要依赖Django3.2,MySQL 支持随机验证码生成与登录验证 简介 基于PythonDjangoMySQL的心理咨询预约系统通过连接数据库获取数据,登录新增随机数字验证码验证。具体可以看…

网络请求优化:如何让你的API飞起来

网络请求优化:如何让你的API飞起来 亲爱的开发者朋友们,你是否曾经遇到过这样的场景:用户疯狂点击刷新按钮,你的服务器却像老年人散步一样慢吞吞地响应。或者,你的应用像个贪吃蛇,疯狂吞噬用户的流量包。如果你对这些情况再熟悉不过,那么恭喜你,你正需要…

【Linux】进程间通信(IPC)——匿名管道

目录 为什么要进行进程间通信? 匿名管道的具体实现 pipe创建内存级文件形成管道 pipe的简单使用 匿名管道的四种情况和五种特性 四种情况 五种特性 PIPE_BUF 命令行管道 | 功能代码:创建进程池 为什么要进行进程间通信? 1.数据传输&…

1.27、基于径向基神经网络的曲线拟合(matlab)

1、基于径向基神经网络的曲线拟合简介及原理 1)原理简介 基于径向基神经网络(Radial Basis Function Neural Network, RBFNN)的曲线拟合是一种常用的非线性拟合方法,通过在输入空间中使用径向基函数对数据进行处理,实现对非线性关系的拟合。 RBFNN的基本原理是将输入空…

opencascade AIS_InteractiveContext源码学习8 trihedron display attributes

AIS_InteractiveContext 前言 交互上下文(Interactive Context)允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是,对于已经被交互上下文识别的交互对象,必须使用上下文方法进行…

Hash表(C++)

本篇将会开始介绍有关于 unordered_map 和 unordered_set 的底层原理,其中底层实现其实就是我们的 Hash 表,本篇将会讲解两种 Hash 表,其中一种为开放定址法,另一种为 hash 桶,在unordered_map 和 unordered_set 的底层…

【Git从入门到精通】——Git常用命令总结

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

火星全球彩色影像图介绍(中分辨率相机)

一、数据基本信息 该数据是利用天问一号轨道器中分辨率相机获取的影像经光度校正、几何校正、全球制图等制作而成的全火星地图数据DOM,每个数据包含一个tif数据文件。该影像图分辨率为76米。 任务型号:天问一号 搭载平台:环绕器 数据获…

批量提取网页表格内容至excel文件

问题背景 将网页的表格内容(5237个股票信息)复制粘贴到excel文件中 网址:A股上市公司名单-A股上市公司名录-A股上市公司大全-商业计划书-可研报告-中商产业研究院数据库-中商情报网 实现代码 # 导入包 import pandas as pd import time# 创…

[安洵杯 2019]easy_web1

知识点: 1.base64加解密 2.md5加解密 3.md5碰撞绕过强类型比较 4.Linux命令绕过 进入页面发现url地址中存在 img参数和一个cmd参数,img参数看上去像是base64编码,可以去尝试一下解码. 进行了两次base64解密得到3535352e706e67看着像16进制那么…

SSM整合--笔记总结

1.概述 ssm(springmvc spring mybatis)这三个框架的整合。 spring和springmvc他们隶属于一家公司,他们无需整合。 spring和mybatis框架的整合。 spring把mybatis中的配置内容放到自己的配置文件中。因为我们可以让tomcat加载spring配置文件。 思考:mybatis配置文件…

SD card知识学习

一、基础知识 1、简介 SD Card 全称(Secure Digital Memory Card),日本电子公司松下(Panasonic)、瑞典公司爱立信(Ericsson)、德国公司西门子(Siemens)共同开发的,于1999年发布根…

Java中如何发送短信?(荣耀典藏版)

大家好,我是月夜枫~~ 本来是没计划写这方面的文章,奈何粉丝经常私信要求整理一篇发短信的文章,今天他来了。 很多业务场景里,我们都需要发送短信,比如登陆验证码、告警、营销通知、节日祝福等等。 这篇文章&#xf…

JavaSE——集合框架二(4/6)-Map集合的遍历方式(键找值,键值对,Lambda)、Map集合案例(需求与分析,问题解决)

目录 Map集合的遍历方式 键找值 键值对 Lambda Map集合案例 需求与分析 问题解决 Map集合的遍历方式 键找值 先获取Map集合全部的键,再通过遍历键来找值。 键值对 把“键值对”看成一个整体进行遍历(较为复杂) Lambda JDK 1.8 开…

C嘎嘎:函数模版和类模版

目录 泛型编程 函数模版 函数模版概念 函数模版的格式 函数模版的原理 函数模版的实例化 函数参数的匹配原则 类模版 类模版的定义格式 类模版的实例化 泛型编程 如何实现一个通用的交换函数呢 void Swap(int& left, int& right) {int temp left;left rig…

【每日一练】python之sum()求和函数实例讲解

在Python中, sum()是一个内置函数,用于计算可迭代对象(如列表、元组等)中所有元素的总和。如下实例: """ 收入支出统计小程序 知识点:用户输入获取列表元素添加sum()函数,统计作用 "&…

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景(背景)问题抽象(挑战)如何做(行动)获得了什么(结果)后记相关资源 通过胶水语言实现工…

Oracle 性能诊断包收费依据

Which Data Dictionary or Dynamic Performance Views Require Purchase of the Diagnostics and / or Tuning Pack? (Doc ID 2082355.1)​编辑To Bottom In this Document Goal Solution References APPLIES TO: Oracle Database - Enterprise Edition - Version 10.2.0.5 …

AI口语练习APP主要功能

AI口语练习APP主要功能可以分为以下几个方面,AI口语练习APP可以帮助用户克服练习口语的场地、时间、语言环境等限制,更方便、高效地练习口语,提高英语口语水平。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎…

Profibus协议转Profinet协议网关模块连接智能电表通讯案例

一、背景 在工业自动化领域,Profibus协议和Profinet协议是两种常见的工业通讯协议,而连接智能电表需要用到这两种协议之间的网关模块。本文将通过一个实际案例,详细介绍如何使用Profibus转Profinet模块(XD-PNPBM20)实…