哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ
今天给大家带来的是【Python】Pandas基础操作手册(上)本次主要讲解, python pandas 模块的一些基本概念, 以及了解 Dataframe 对象的创建, 赋值, 保存. 一起来看看叭~
本期收录于博主的专栏:Python_保护小周ღ的博客-CSDN博客
适用于编程初学者,感兴趣的朋友们可以订阅,查看其它 “Python 基础知识”。
更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★* ‘
一、Pandas 是啥?
Pandas 是一个开源的 Python 数据分析库,主要用于数据操作和数据分析。它提供了高效、灵活的数据结构和函数,使得数据处理变得更加便捷。Pandas 主要包含两个核心数据结构:
-
Series:一维数组,类似于 Python 的列表或 NumPy 的一维数组,可以存储任意类型的数据,还支持索引。 形如:
-
DataFrame:二维表格,类似于电子表格或数据库表,可以看作是多个 Series 的集合。DataFrame 支持列名和行索引,方便数据的存储和访问。形如:
Pandas 的主要功能
- 数据清洗:处理缺失值、重复数据、格式转换等。
- 数据选择和过滤:根据条件选择特定的数据。
- 数据聚合和分组:对数据进行分组并进行求和、平均等计算。
- 数据合并:将多个 DataFrame 进行合并或连接。
- 时间序列分析:处理时间序列数据,提供丰富的时间日期功能。
应用领域
Pandas 广泛应用于数据科学、金融、统计分析、机器学习等领域,是数据分析和数据科学工作流中不可或缺的工具之一。
二、Pandas 相关操作
2.1 使用环境
集成开发环境: PyChorm
如何引入Pandas:
你可以在命令行中使用以下命令临时指定阿里云源下载安装:
pip install pandas -i https://mirrors.aliyun.com/pypi/simple/
导入模块:
import pandas as pd
在 Python 中,导入模块时常用的一些关键字和语法包括:
1. import :
用于导入整个模块。
2. from ... import
. . . : 用于从模块中导入特定的属性或函数。
3. as
: 用于给模块或导入的函数/类指定一个别名。
接下里我们就可以愉快的学习 Pandas 啦~
2.1 声明一个DataFrame对象并赋值
: pd.DataFrame 则是声明 dataframe 对象的类型, 以便可以调用方法(pyhton 是解释型语言, 如果不提前声明, 则需要解释到该行代码才能知道他的类型).
if __name__ == "__main__":
# 声明一个 dataframe 对象
dataframe: pd.DataFrame = pd.DataFrame()
2.1.1 DataFrame 直接赋值
当前标题的主要目的, 为了让大家了解其定义, 以及背后的数据结构, 没有太大的意义, 接下来是有意义的操作.
# 创建一个包含数据的字典(也就是 map 结构的数据)
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 22],
'邮箱': ['zhangsan@example.com', 'lisi@example.com', 'wangwu@example.com']
}
# 声明一个 DataFrame 对象并赋值
df = pd.DataFrame(data)
你可以这样写:
# 声明一个 DataFrame 对象并赋值
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 22],
'邮箱': ['zhangsan@example.com', 'lisi@example.com', 'wangwu@example.com']
})
2.1.2 定义一个 Series(列)
# 声明一个 DataFrame 对象并赋值
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 22],
'邮箱': ['zhangsan@example.com', 'lisi@example.com', 'wangwu@example.com']
})
print(df)
# 创建一个新的 Series (其参数是 list, [] 列表)
jobs_eries = pd.Series(['工程师', '医生', '教师'], name='职业')
# 将 Series 添加到 DataFrame, 就这样水灵灵的添加了一列
df['职业'] = jobs_eries
# 打印
print(df)
点击打开之后则是如下展示内容:
正常情况下 dataframe 对象的数据来源于外部文件什么的, 常用的话, 操作有从 excel 表. csv文件, JSON, sql, API, 中获取数据, 也有的从 其他 dataframe 数据合并... 加入进来的.
2.1.3 DataFrame 从 Excel 中获取数据
# 读取
import openpyxl
# 保存
from openpyxl.utils.dataframe import dataframe_to_rows
通过 pandas 提供的 read_excel 方法可以从 excel 中读取数据, 第一个参数为 excel表的路径
# 通过 pandas 提供的 read_excel 方法可以从 excel 中读取数据,
# 第一个参数为 excel 的路径
# sheet_name 参数则是指定读取那个 excel表中 sheet 对象
# 如果没有指定, sheet_name 参数默认读取, Sheet1 对象的值
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
以下的是一些其他的常用参数, 用的最多的还是 sheet_naem 和 header
常用参数
sheet_name
: 要读取的工作表名称或索引,默认为第一个工作表。header
: 指定行号作为列名,默认为0
。index_col
: 指定用作行索引的列。usecols
: 指定要读取的列,可以是列名或列索引。dtype
: 指定列的数据类型。
注意事项
- 需要安装
openpyxl
或xlrd
库来支持 Excel 文件的读取。 - Excel 文件中的空行可能会导致数据读取不一致(后面讲)。
2.1.4 DataFrame 从 CSV文件 中获取数据
CSV(Comma-Separated Values,逗号分隔值)文件是一种广泛使用的纯文本文件格式,用于存储表格数据。CSV 文件通常用于数据导入和导出,特别是在不同软件和数据库之间传输数据时。以下是关于 CSV 文件的详细介绍及其格式特点。
1. CSV 文件的基本概念
- 定义:CSV 文件是一种将数据以文本形式存储的格式,使用特定的分隔符(通常是逗号)将数据项分隔开来。
- 用途:CSV 文件通常用于数据交换、数据分析和数据存储,支持多种应用程序,如电子表格软件(Excel)、数据库管理系统(如 MySQL、PostgreSQL)和编程语言(如 Python、R)。
2. CSV 文件的格式
CSV 文件具有以下基本格式特征:
- 行与列:数据被组织成行和列。每一行代表一条记录,而每一列代表记录中的一个字段(或属性)。
- 分隔符:默认情况下,字段使用逗号(
,
)分隔,但也可以使用其他分隔符,如制表符(\t
)、分号(;
)等。- 第一行:通常,CSV 文件的第一行包含列名(即字段名),用于描述每列数据的内容。
- 文本引用:当字段包含分隔符、换行符或引号时,字段值通常用双引号(
"
)括起来。例如:"John, Doe"
。- 缺失值:缺失的数据项可以用空字符串表示,通常会留出一个位置,表示该列没有数据。
3. 示例
以下是一个简单的 CSV 文件示例:
Name,Age,Occupation John Doe,29,Software Engineer Jane Smith,34,Data Scientist "Bob, Jr.",25,"Intern, Marketing"
在这个示例中:
- 第一行包含列名
Name
、Age
和Occupation
。- 随后的每一行代表一个人的记录。
- 注意
"Bob, Jr."
和"Intern, Marketing"
中的逗号被双引号括起来,以避免被误解析为分隔符。4. CSV 文件的优缺点
优点
- 简单易用:CSV 格式直观、易于理解,适合大多数用户。
- 广泛支持:几乎所有数据处理工具和编程语言都支持 CSV 文件的读写。
- 可读性:作为纯文本文件,CSV 文件可以使用任何文本编辑器打开和编辑
缺点
- 缺乏约束:CSV 文件不支持数据完整性约束(如主键、外键约束等),这可能导致数据重复或不一致。例如,如果同一条记录被多次导入,可能无法自动检测并防止这种情况。
- 格式不统一:不同的应用程序可能对 CSV 的解析和格式化有不同的处理方式,导致同一文件在不同系统上可能出现读取错误或数据损坏。
- 无法保留数据类型:CSV 文件中的所有数据都被视为文本,无法直接存储数据类型信息(如整数、日期、布尔值等)。这可能导致在导入数据时出现错误或需要进行额外的转换。
- 格式化信息丢失:例如,在电子表格应用程序中,单元格可能具有特定的格式(如货币、百分比等),而 CSV 文件无法保留这些格式化信息。
不支持复杂数据结构
通过 pandas 提供的 read_csv 方法可以从 csv文件 中读取数据, 第一个参数为 csv 文件的路径
df = pd.read_csv('data.csv', **kwargs)
**kwargs
是一种用于传递可变数量的关键字参数的语法。它的全称是 "keyword arguments",使得函数可以接收任意数量的命名参数。
当你调用 pd.read_csv 函数时,可以使用 **kwargs 来传递其他参数,比如:
df = pd.read_csv('data.csv', sep=',', header=0, index_col=None)
这里的 sep=','
、header=0
和 index_col=None
都是关键字参数。如果你把这些参数放在 **kwargs
中传递,可以这样写:
params = {
'sep': ',',
'header': 0,
'index_col': None
}
df = pd.read_csv('data.csv', **params)
常用参数
sep
: 指定分隔符,默认为','
,可以设置为'\t'
(制表符)等。header
: 指定行号作为列名,默认为0
。设置为None
时不使用任何行作为列名。index_col
: 指定用作行索引的列,可以是列名或列的索引。dtype
: 指定列的数据类型。na_values
: 自定义缺失值的标识。
注意事项
- 确保文件路径正确。
- 大文件可能会占用较多内存,可以使用
chunksize
参数按块读取。
使用 CSV 文件呢, 相较于 excel 文件来说, 更加轻量, 如果单纯的执行数据存取, 中转操作, CSV 将是不二之选, 但是, 如果程序运行的结果要给领导康康的话, 还是保存为 excel 文件 方便查阅~
2.1.5 DataFrame 从 JSON 中获取数据
在 python 中, 字典类型的数据 和 JSON 数据是可以互相转换的
1. 字典转换为 JSON
要将 Python 字典转换为 JSON 字符串,可以使用 json.dumps()
函数。
import json
# 定义一个 Python 字典
data = {
"name": "Alice",
"age": 30,
"city": "New York",
"is_student": False,
"courses": ["Math", "Science"],
}
# 将字典转换为 JSON 字符串
json_string = json.dumps(data)
# 打印 JSON 字符串
print("JSON 字符串:")
print(json_string)
2. JSON 转换为字典
要将 JSON 字符串转换为 Python 字典,可以使用 json.loads()
函数。
import json
# 1. 字典转换为 JSON
data = {
"name": "Alice",
"age": 30,
"city": "New York",
"is_student": False,
"courses": ["Math", "Science"],
}
# 将字典转换为 JSON 字符串
json_string = json.dumps(data)
print("JSON 字符串:")
print(json_string)
# 2. JSON 转换为字典
data_dict = json.loads(json_string)
print("\nPython 字典:")
print(data_dict)
通过 pandas 提供的 read_json 方法可以从 excel 中读取数据, 第一个参数为 json 文件的路径也可以是 json 对象
df = pd.read_json('data.json', **kwargs)
同时, 也是支持 **kwargs 格式的传参(详情可见上文 csv部分) 即:
params = {
'orient': 'split',
'convert_dates': True,
}
df = pd.read_json('data.json', **params)
常用参数
orient
: 指定 JSON 数据的格式,常用值包括'split'
,'records'
,'index'
,'columns'
,'values'
。dtype
: 指定列的数据类型。convert_dates
: 指定是否将字符串转换为日期,默认为True
。
注意事项
- 确保 JSON 数据格式正确,避免解析错误。
- 大的 JSON 文件可能会占用大量内存。
2.1.6 DataFrame 从 数据库 中获取数据
前提条件
-
确保已安装
pandas
和SQLAlchemy
库,可以使用以下命令安装:pip install pandas sqlalchemy
-
需要有一个可用的 SQL 数据库(例如 SQLite、MySQL、PostgreSQL 等)和相应的连接信息。
下面是一个示例,展示如何从 mysql 数据库读取数据。假设我们有一个名为 employees.db
的数据库,里面有一个名为 employees
的表。
# 创建数据库连接
# 数据库连接配置
username = 'your_username'
password = 'your_password'
host = 'your_host'
port = 'your_port' # 通常是 3306
database = 'your_database'
engine = create_engine(f'mysql+pymysql://{username}:{password}@{host}:{port}/{database}')
# SQL 查询语句
sql_query = 'SELECT * FROM employees'
# 使用 pd.read_sql 从 SQL 数据库读取数据到 DataFrame
df = pd.read_sql(sql_query, engine)
# 显示 DataFrame 的前几行
print(df.head())
常用参数
con
: 数据库连接对象。index_col
: 指定用作行索引的列。params
: SQL 查询的参数。coerce_float
: 将字符串转换为浮点数,默认为True
。
注意事项
- 确保 SQL 查询语句正确,避免 SQL 注入风险。
- 使用连接池来提高性能。
正常情况下, 我们是不会采用这种方式来操作数据库的, 而是通过请求后端提供的 API 来操作数据库, 也是为了数据库安全考虑, 以及规范~~~
2.1.7 DataFrame 从 API 中获取数据
这种方式也是, 也是在实际应用中非常常见的操作一切操作还会在后端留痕, 更加安全嘛.
准备工作
在开始之前,请确保你已经安装了请求库。
- Requests:一个简单易用的 HTTP 客户端库。
可以使用以下命令安装 requests
库:
pip install requests
其次, 需要提供一个可以访问的 API , 提供数据来源, 可能返回一个 json, 也可能返回一个 excel 呢,这个要看双方的约定是啥样的.
import requests
# API 端点(举例)
url = "https://jsonplaceholder.typicode.com/posts"
# 发起 GET 请求
response = requests.get(url)
# 检查请求是否成功
if response.status_code == 200:
# 解析 JSON 数据, 有可能是别的啥格式, 具体看约定
data = response.json()
print(data)
else:
print(f"请求失败,状态码: {response.status_code}")
总之这一快, 主要是 request 模块的内容的, 感兴趣的朋友可以去了解一下(博主还没有写这一块的博客).
2.3 将 ''nan'' 转换为 ‘’ (空字符)
在 Pandas 的 DataFrame 中,NaN
(Not a Number)值表示缺失或无效的数据。NaN
值的出现通常有以下几种原因:
数据缺失:
数据在收集或录入过程中可能会丢失。例如,用户未填写某个字段,或者在数据抓取过程中部分数据未能成功获取。计算结果:
某些计算操作可能会产生NaN
值。例如,尝试对零进行除法、计算无穷大与无穷大的差等情况都会导致NaN
。合并操作:
在进行 DataFrame 的合并(如merge
或join
)时,如果某些键在一侧缺失,则结果中的相应值会被填充为NaN
。数据类型转换:
在尝试将某种类型的数据转换为另一种类型时,如果转换失败,Pandas 可能会将结果设置为NaN
。例如,尝试将字符串转换为数值时,遇到无法转换的字符串。缺省值:
在创建 DataFrame 时,可以指定缺省值为NaN
,以便于后续的数据处理和分析。例如,可以通过 NumPy 的np.nan
来初始化 DataFrame 的某些元素。
举个例子:
第一步:
使用 pandas 将学生表的 sheet1 工作簿的数据读取成一个 dataframe 的对象在内存中.
所以像这种情况, 在内存中出现了 NaN值, 在数据计算中, 或者使用都是不方便的, 那么以下是常用的几种方法.
在数据分析过程中,处理 NaN
值是很常见的任务。Pandas 提供了多种方法来处理这些缺失值,例如:
dropna()
:删除含有 NaN
的行或列。
fillna(value)
:用指定的值填充 NaN
。
isna()
或 isnull()
:检查哪些位置是 NaN
。
在 Pandas 中,
isna()
和isnull()
方法用于检查 DataFrame 或 Series 中哪些位置是NaN
(缺失值)。这两个方法的功能相同,可以互换使用。它们返回一个布尔型的 DataFrame 或 Series,其中True
表示该位置是NaN
,False
表示该位置不是NaN
。
-
定位缺失值:可以通过布尔索引直接定位缺失值的位置。
missing_values = dataframe[dataframe.isna().any(axis=1)]
print("\n包含 NaN 的行:")
print(missing_values)
2.4 DataFrame 的保存
Pandas DataFrame 可以保存为多种格式,以便于数据的持久化和共享。以下是一些常用的保存格式及其对应的函数:
2.4.1 CSV 格式
- 函数:
to_csv()
- 示例:
df.to_csv('data.csv', index=False)
index=False
表示不保存行索引。
2.4.2 Excel 格式
- 函数:
to_excel()
- 示例:
df.to_excel('data.xlsx', index=False)
- 需要安装
openpyxl
或xlsxwriter
库来支持 Excel 格式。
- 需要安装
def saveDFToExcelSheet(df: pd.DataFrame, target_path, sheet_name):
"""
将 dataFrame 数据存入指定的 路径下的 excel表 sheet中.
:param df: 保存的 pandas 对象
:param target_path: 目标文件的路径
:param sheet_name: 要保存为的 sheet 的名字
:return:
"""
# 检查目标文件是否存在
try:
workbook = openpyxl.load_workbook(target_path)
except FileNotFoundError:
# 如果文件不存在,则创建一个新的工作簿
workbook = openpyxl.Workbook()
# 检查 sheet_name 是否已经存在
if sheet_name in workbook.sheetnames:
# 如果已经存在,则将新建的工作表重命名
new_sheet_name = sheet_name + "_new"
new_sheet = workbook.create_sheet(new_sheet_name)
else:
# 如果不存在,则直接创建新的工作表
new_sheet = workbook.create_sheet(sheet_name)
# 将 DataFrame 中的数据写入工作表
for row in dataframe_to_rows(df, index=False, header=True):
new_sheet.append(row)
# 保存工作簿到目标文件
workbook.save(target_path)
print("sheet 对象已成功保存至指定 excel 中")
2.4.3. JSON 格式
- 函数:
to_json()
- 示例:
df.to_json('data.json', orient='records', lines=True)
orient
参数可以设置不同的格式,records
是常用的格式之一。
也可以通过 SQL 保存到数据库, 但是不推荐 pandas 直接操作数据库, 而是通过 requets 模块发送请求调用后端提供的 API 间接的操作数据库, 当然最主要的数据结构还是 json 啦.
好了,到这里,【Python】Pandas基础操作手册(上)博主已经分享完了,阐述较为基础, 希望对大家有所帮助,如有不妥之处欢迎批评指正。
下期预告: 【Python】Pandas基础操作手册 (下) 将详细描述针对 Dataframe 对象的"增删查改"
感谢每一位观看本篇文章的朋友,更多精彩敬请期待:保护小周ღ *★,°*:.☆( ̄▽ ̄)/$:*.°★*
遇见你,所有的星星都落在我的头上……