1、定义
Pandas是基于Python的数据分析和数据处理库
具体来说,Pandas 是基于 NumPy 的,用于处理结构化数据,比如表格和时间序列数据,特别适合大规模的数据处理和清洗任务。
2、数据结构Pandas 主要引入了两种新的数据结构:DataFrame 和 Series。
DataFrame:类似于 Excel 或数据库中的表格,它是一个二维的、带有行和列标签的数据结构。每列可以包含不同类型的数据。
Series:是一维的数组,带有标签(类似于 Python 的字典),可以包含任何类型的数据。
2.1DataFrame的主要特性
二维数据结构
DataFrame 是一个类似于表格的二维数据结构,行和列分别代表不同的数据维度。每个 DataFrame 都由一个索引(index,行标签)和列(columns)构成。
行标签(index)可以是默认的整数索引,也可以是指定的字符串、日期等自定义索引。
每列的数据类型可以不同(例如,一列是整数,另一列是浮点数,另一列是字符串)。
多种创建方式
通过 Python 字典、列表、NumPy 数组、Excel 文件、SQL 数据库等多种方式创建 DataFrame。比如从字典创建:
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'Salary': [50000, 60000, 70000]}
df = pd.DataFrame(data)
print(df)
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
通过二维数组创建
data = [
['Alice', 25, 50000],
['Bob', 30, 60000],
['Charlie', 35, 70000]
]
df = pd.DataFrame(data, columns=['Name', 'Age', 'Salary'])
print(df)
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
pandas基本操作
# 查看前几行数据
df.head(2) #查看前两行
Name | Age | Salary | |
---|---|---|---|
0 | Alice | 25 | 50000 |
1 | Bob | 30 | 60000 |
# 选择列
df['Age'] #选择Age列
0 25
1 30
2 35
Name: Age, dtype: int64
# 选择多列
df[['Age','Salary']]
Age | Salary | |
---|---|---|
0 | 25 | 50000 |
1 | 30 | 60000 |
2 | 35 | 70000 |
# 选择行: 使用 iloc 根据行号选择,或使用 loc 根据索引标签选择。
df.iloc[0] # 选择第一行
Name Alice
Age 25
Salary 50000
Name: 0, dtype: object
df.loc[0] # 如果有标签索引,也可以使用 loc
Name Alice
Age 25
Salary 50000
Name: 0, dtype: object
iloc 和 loc的区别
iloc 是通过行列的整数位置(位置编号)来进行数据选择的。
# 选择第一行
df.iloc[0]
# 输出:
# Name Alice
# Age 25
# Salary 50000
# Name: 0, dtype: object
# 选择第一行第一列的元素
df.iloc[0, 0]
# 输出: 'Alice'
# 选择前两行和所有列
df.iloc[:2, :]
# 输出:
# Name Age Salary
# 0 Alice 25 50000
# 1 Bob 30 60000
Name | Age | Salary | |
---|---|---|---|
0 | Alice | 25 | 50000 |
1 | Bob | 30 | 60000 |
loc 是通过行列的标签(索引标签和列名)来进行数据选择的。
行索引可以是默认的整数,也可以是自定义的标签(例如日期、名字等),而列索引通常是列名。
# 选择标签为 0 的行(即第一行)
df.loc[0]
# 输出:
# Name Alice
# Age 25
# Salary 50000
# Name: 0, dtype: object
# 选择 'Age' 列中标签为 0 的元素
df.loc[0, 'Age']
# 输出: 25
# 选择所有行的 'Name' 和 'Salary' 列
df.loc[:, ['Name', 'Salary']]
# 输出:
# Name Salary
# 0 Alice 50000
# 1 Bob 60000
# 2 Charlie 70000
# 通过条件选择:筛选出 Age 大于 25 的行
df.loc[df['Age'] > 25]
# 输出:
# Name Age Salary
# 1 Bob 30 60000
# 2 Charlie 35 70000
Name | Age | Salary | |
---|---|---|---|
1 | Bob | 30 | 60000 |
2 | Charlie | 35 | 70000 |
切片行为:
iloc:切片遵循 Python 的默认行为(右开区间),即 df.iloc[0:2] 会选择第 0 行和第 1 行,不包含第 2 行。
loc:切片是包含结束点的(右闭区间),即 df.loc[0:2] 会选择第 0 行到第 2 行,包含第 2 行。
灵活性:
iloc 只能通过整数位置进行访问。
loc 更加灵活,支持标签索引和条件筛选。
2.2、Series的主要特性
Series 是 pandas 中的另一种基本数据结构,它是一维的类似于数组、列表或者字典的对象。每个 Series 包含两个主要部分:一组数据以及与数据对应的索引。Series 作为 DataFrame 的基础结构之一,可以看作是单列的数据表。
series的构成
数据(data):可以是任何一维的数据类型,比如列表、数组、字典、标量值等。
索引(index):与数据相关的标签,用于标识每个数据的位置。默认情况下,pandas 为每个数据赋予从 0 开始的整数索引,但也可以为 Series 指定自定义索引。
创建serise
Series 可以通过不同方式创建,常见的方法包括使用列表、字典、标量值或 numpy 数组。
import pandas as pd
data = [10, 20, 30, 40]
s = pd.Series(data)
print(s)
0 10
1 20
2 30
3 40
dtype: int64
# 通过字典创建
data = {'a': 10, 'b': 20, 'c': 30}
s = pd.Series(data)
print(s)
a 10
b 20
c 30
dtype: int64
# 通过标量创建
s = pd.Series(5, index=['a', 'b', 'c'])
print(s)
a 5
b 5
c 5
dtype: int64
Series的属性
values:返回数据部分的值,类型为 numpy 数组。
index:返回 Series 的索引。
dtype:返回 Series 中数据的类型。
s.values
array([5, 5, 5], dtype=int64)
s.index
Index(['a', 'b', 'c'], dtype='object')
s.dtype
dtype('int64')
访问和操作Serise
# 访问第一个元素
s.iloc[0]
5
# 通过标签访问 'a' 对应的值
s['a']
5
# 筛选大于 15 的元素
s[s > 15]
Series([], dtype: int64)
Series的常用操作
Series 支持许多类似于数组的操作,例如加法、减法、乘法、除法等。这些操作默认是逐元素应用的。
s = pd.Series([10, 20, 30, 40])
# 每个元素加 5
s + 5
0 15
1 25
2 35
3 45
dtype: int64
可以对 Series 应用函数,比如 numpy 函数或自定义函数。
import numpy as np
# 对每个元素取平方根
np.sqrt(s)
0 3.162278
1 4.472136
2 5.477226
3 6.324555
dtype: float64
# Series 支持类似于 cumsum(累加)等操作。
s.cumsum()
0 10
1 30
2 60
3 100
dtype: int64
与DataFrame的关系
Series 可以看作是一个单独的列,DataFrame 是由多个 Series 组成的二维表格型数据结构。可以从 DataFrame 中提取出某列并将其作为 Series 进行操作
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
# 提取 DataFrame 中的 A 列作为 Series
s = df['A']
3、数据读写
Pandas 提供了丰富的数据输入输出功能,支持从 CSV、Excel、SQL、JSON 等文件读取数据,并能将处理后的数据保存为这些格式
# 读取CSV文件
import pandas as pd
# 读取 CSV 文件
df = pd.read_csv('your_file.csv')
常用参数:
sep:指定分隔符,默认是逗号 ,,可以修改为其他分隔符如 ‘\t’。
header:指定是否有标题行,默认第一行为标题。
names:如果没有标题行,可以用 names 参数指定列名。
usecols:读取特定的列。
# 读取 Excel 文件
df = pd.read_excel('file.xlsx', sheet_name='Sheet1')
常用参数:
sheet_name:指定要读取的工作表,默认为第一个工作表。
header:指定是否有标题行。
# 读取 JSON 文件
df = pd.read_json('file.json')
# 从SQL数据库中读取数据
import sqlite3
# 连接到 SQLite 数据库
conn = sqlite3.connect('database.db')
# 从 SQL 查询结果中读取数据
df = pd.read_sql('SELECT * FROM table_name', conn)
# 写入 CSV 文件
df.to_csv('output.csv', index=False)
常用参数:
index:是否写入行索引,默认是 True,可以设为 False 以忽略索引。
sep:指定分隔符,默认为逗号 ,。
columns:指定要写入的列
# 写入 Excel 文件
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
sheet_name:指定工作表的名称。
index:是否写入行索引,默认是 True。
# 写入 JSON 文件
df.to_json('output.json', orient='records')
常用参数:
orient:指定 JSON 文件的格式,常见的有 ‘split’、‘records’、‘index’ 等
# 写入 SQL 数据库
df.to_sql('table_name', conn, if_exists='replace', index=False)
常用参数:
name:表名。
con:数据库连接对象。
if_exists:指定如果表已存在的处理方式,如 ‘replace’(替换)、‘append’(追加)或 ‘fail’(报错)。
4、数据清洗和操作
提供处理缺失数据(NaN)的工具,比如填充、删除缺失值。
数据筛选和过滤功能,可以方便地根据条件进行数据筛选。
支持数据排序、分组和聚合(groupby 功能),适合进行数据分析和统计。
4.1、大文件的处理
当处理大型文件时,可以使用以下技巧来优化读取速度
分块读取
使用 chunksize 参数将大文件分成小块逐步读取。
for chunk in pd.read_csv('large_file.csv', chunksize=10000):
process(chunk) # 对每个块进行处理,process为自定义的处理数据的函数
指定列
使用 usecols 只读取需要的列,减少内存占用。
df = pd.read_csv('file.csv', usecols=['col1', 'col2'])
指定数据类型
通过 dtype 参数预先设置列的数据类型,提升读取效率。
因为在默认情况下,pandas 会在读取数据时尝试自动推断每列的数据类型(如整数、浮点数、字符串等)。这一过程需要 pandas 扫描每一列的数据,并推测出最适合的数据类型。这会导致以下两种问题:
计算开销:自动推断数据类型会消耗额外的计算资源和时间,尤其在数据量大时更加明显。
内存占用:pandas 默认会将整数列推断为 int64 类型,浮点数列推断为 float64 类型。这些 64 位的数据类型虽然精度高,但会占用更多的内存。在实际应用中,如果只需要较小的整数或精度较低的浮点数,使用 32 位或更小的类型可以减少内存占用并加速读取。
df = pd.read_csv('file.csv', dtype={'col1': 'int32', 'col2': 'float64'})
4.2、处理缺失值
在读取数据时,pandas 会自动将无法识别的数据标记为缺失值 NaN。可以使用以下方法处理缺失值:
dropna():删除包含缺失值的行或列。
fillna():用特定值填充缺失值。
df.dropna() # 删除包含缺失值的行
df.fillna(0) # 用 0 填充缺失值
5、时间序列处理
Pandas 提供了丰富的时间序列工具,包括时间戳、时间范围生成、重采样等,非常适合金融和经济数据分析。
下篇博客专门讲解如何用Pandas做时间序列处理,欢迎大家关注~~~
6、数据可视化
虽然 Pandas 不是一个可视化库,但它可以与 Matplotlib 等库无缝结合,快速生成图表,如折线图、柱状图、直方图等。
** 这个以后再更新~~~**
有用的话,希望小伙伴们点个赞 和 关注,新人求赞~