文章目录
一、简介
Pandas
是一个用于数据操作和分析的开源 Python 库。它提供了高效的数据结构和数据分析工具,特别适合处理结构化数据(如表格数据)。Pandas 在数据清洗、预处理、统计分析、数据可视化
等方面有广泛的应用。
Github:https://github.com/pandas-dev/pandas
User Guide:https://pandas.pydata.org/docs/user_guide/index.html
主要特点:
易用的数据结构:
- Series:一维数组,类似于 Python 的列表或字典。
- DataFrame:二维数据结构,类似于 Excel 表格或 SQL 表。
数据操作:
- 支持对数据进行增删改查操作。
- 提供丰富的数据清洗和预处理功能,包括缺失值处理、数据过滤、分组、聚合等。
- 支持多种数据格式的读写,如 CSV、Excel、SQL、JSON 等。
高效的性能:
- 基于 NumPy 实现,具有高效的计算性能。
- 支持多种加速库,如 Dask、Modin,可以在大数据处理时提升性能。
数据可视化:
- 与 Matplotlib、Seaborn 等可视化库无缝集成,方便生成各种类型的图表。
二、Pandas基本数据结构及其方法
2.1 Series
pd.Series
是Pandas库中的一种基本数据结构,用于表示一维的带标签数组。它既可以包含整数、浮点数、字符串等数据类型,也可以包含其他Python对象。
可以通过多种方式创建一个Series:
import pandas as pd
# 通过列表创建
s = pd.Series([1, 3, 5, 7, 9])
# 通过字典创建
data = {'a': 1, 'b': 3, 'c': 5}
s = pd.Series(data)
# 通过标量创建(指定索引)
s = pd.Series(5, index=['a', 'b', 'c', 'd'])
单从这里看,Series是具有列表或字典的特性的。
🟢Series 属性:
属性 | 说明 | 例 |
---|---|---|
index | 返回或设置Series的索引 | s.index = [‘A’, ‘B’, ‘C’, ‘D’, ‘E’] |
values | 返回Series中的数据(不包含索引) | s.values |
name | 返回或设置Series的名称 | s.name = ‘my_series’ |
dtype | 返回Series的数据类型 | s.dtype |
🟢Series 方法:
(1)基本方法
方法 | 功能描述 | 示例代码 |
---|---|---|
head(n) |
返回前n 个元素,默认返回前5个 |
s.head(3) |
tail(n) |
返回后n 个元素,默认返回后5个 |
s.tail(3) |
shape |
返回Series的形状(元素个数) | s.shape |
index |
返回Series的索引标签 | s.index |
values |
返回Series的值(不包含索引) | s.values |
dtypes |
返回Series的数据类型 | s.dtypes |
(2)数据选择与操作
方法 | 功能描述 | 示例代码 |
---|---|---|
loc[] |
按标签选择元素 | s.loc['a'] |
iloc[] |
按位置选择元素 | s.iloc[0] |
at[] |
快速访问单个元素(标签方式) | s.at['a'] |
iat[] |
快速访问单个元素(位置方式) | s.iat[0] |
drop(labels) |
删除指定的元素 | s.drop('a') |
rename() |
重命名索引标签 | s.rename({'a': 'alpha'}) |
replace() |
替换指定的值 | s.replace(10, 100) |
map() |
对Series中的每个元素应用函数或映射 | s.map(lambda x: x * 2) |
apply(func) |
对Series中的每个元素应用函数 | s.apply(lambda x: x + 1) |
(3)数据聚合与统计
方法 | 功能描述 | 示例代码 |
---|---|---|
sum() |
计算Series中所有元素的和 | s.sum() |
mean() |
计算Series中所有元素的均值 | s.mean() |
median() |
计算Series中所有元素的中位数 | s.median() |
mode() |
计算Series中所有元素的众数 | s.mode() |
std() |
计算Series中所有元素的标准差 | s.std() |
var() |
计算Series中所有元素的方差 | s.var() |
count() |
计算Series中非NA/null值的数量 | s.count() |
min() |
计算Series中所有元素的最小值 | s.min() |
max() |
计算Series中所有元素的最大值 | s.max() |
(4) 处理缺失值
方法 | 功能描述 | 示例代码 |
---|---|---|
isna() |
检测缺失值(NA/null) | s.isna() |
notna() |
检测非缺失值 | s.notna() |
fillna(value) |
用指定值填充缺失值 | s.fillna(0) |
dropna() |
删除包含缺失值的元素 | s.dropna() |
2.2 DataFrame
pandas.DataFrame
是Pandas库中最重要的数据结构之一,主要用于表示二维的数据表格。它可以看作是由多个Series
构成的字典,每个Series
表示DataFrame的一列。以下是有关DataFrame
的详细介绍:
可以通过多种方式创建一个DataFrame
:
通过字典创建
data = { 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35], 'city': ['New York', 'San Francisco', 'Los Angeles'] } df = pd.DataFrame(data)
通过列表的列表创建
data = [['Alice', 25, 'New York'], ['Bob', 30, 'San Francisco'], ['Charlie', 35, 'Los Angeles']] columns = ['name', 'age', 'city'] df = pd.DataFrame(data, columns=columns)
通过字典的字典创建
data = { 'name': {'0': 'Alice', '1': 'Bob', '2': 'Charlie'}, 'age': {'0': 25, '1': 30, '2': 35}, 'city': {'0': 'New York', '1': 'San Francisco', '2': 'Los Angeles'} } df = pd.DataFrame(data)
通过numpy数组创建
data = np.array([['Alice', 25, 'New York'], ['Bob', 30, 'San Francisco'], ['Charlie', 35, 'Los Angeles']]) df = pd.DataFrame(data, columns=['name', 'age', 'city'])
输出:
name age city
0 Alice 25 New York
1 Bob 30 San Francisco
2 Charlie 35 Los Angeles
🟢 DataFrame 属性:
属性 | 说明 | 例 |
---|---|---|
index | 返回DataFrame的行索引 | print(df.index) |
columns | 返回DataFrame的列标签 | print(df.columns) |
shape | 返回DataFrame的维度(行数,列数) | print(df.shape) |
values | 返回DataFrame的所有数据(不包含索引和列标签) | print(df.values) |
dtype | 返回每列的数据类型 | print(df.dtypes) |
🟢DataFrame 方法:
pandas.DataFrame
提供了丰富的方法来进行数据操作和分析。
(1)基本方法
方法 | 功能描述 | 示例代码 |
---|---|---|
head(n) |
返回前n 行,默认返回前5行 |
df.head(3) |
tail(n) |
返回后n 行,默认返回后5行 |
df.tail(3) |
shape |
返回DataFrame的维度(行数,列数) | df.shape |
describe() |
生成描述性统计信息 | df.describe() |
info() |
打印DataFrame的信息摘要 | df.info() |
columns |
返回DataFrame的列标签 | df.columns |
index |
返回DataFrame的行索引 | df.index |
dtypes |
返回每列的数据类型 | df.dtypes |
values |
返回DataFrame的数据(不含索引和列标签) | df.values |
(2) 数据选择与操作
方法 | 功能描述 | 示例代码 |
---|---|---|
loc[] |
按标签选择行和列 | df.loc['row_label', 'col_label'] |
iloc[] |
按位置选择行和列 | df.iloc[0, 1] |
at[] |
快速访问单个元素(标签方式) | df.at['row_label', 'col_label'] |
iat[] |
快速访问单个元素(位置方式) | df.iat[0, 1] |
drop(labels, axis) |
删除指定行或列 | df.drop('column_name', axis=1) |
rename() |
重命名行或列标签 | df.rename(columns={'old_name': 'new_name'}) |
set_index() |
设置指定列为索引 | df.set_index('column_name') |
reset_index() |
重置索引为默认整数索引 | df.reset_index() |
sort_values(by) |
按指定列排序 | df.sort_values(by='column_name') |
sort_index() |
按索引排序 | df.sort_index() |
fillna(value) |
用指定值填充缺失值 | df.fillna(0) |
dropna() |
删除包含缺失值的行或列 | df.dropna() |
duplicated() |
检测重复的行 | df.duplicated() |
(3)数据聚合与变换
方法 | 功能描述 | 示例代码 |
---|---|---|
groupby(by) |
按指定列分组 | df.groupby('column_name').mean() |
agg(func) |
对分组后的数据应用多个聚合函数 | df.groupby('column_name').agg(['sum', 'mean']) |
apply(func) |
对DataFrame的每列或每行应用函数 | df.apply(lambda x: x.max()) |
pivot_table() |
创建数据透视表 | df.pivot_table(index='row_col', values='data_col', aggfunc='mean') |
melt() |
将DataFrame从宽格式转换为长格式 | df.melt(id_vars=['id'], value_vars=['var1', 'var2']) |
(4)数据合并与连接
方法 | 功能描述 | 示例代码 |
---|---|---|
merge() |
合并两个DataFrame | pd.merge(df1, df2, on='key') |
concat() |
连接多个DataFrame | pd.concat([df1, df2]) |
join() |
按索引连接两个DataFrame | df1.join(df2) |
三、标签和索引
在Pandas中,"索引"和"标签"在某些方面相似,但它们的使用和作用有些不同。
索引(Index):
定义:在Pandas中,"索引"指的是用于标识数据的位置的标签。它可以是行索引(对于
DataFrame
和Series
的行)或列索引(对于DataFrame
的列)。功能:
- 定位和访问数据:索引用于定位和访问数据。例如,通过行索引,可以快速访问特定行的数据。
- 对齐数据:在进行数据合并、对齐等操作时,Pandas会自动对齐索引,以确保数据一致性。
- 标签的灵活性:索引不仅可以是整数,还可以是字符串、日期、时间等类型,提供了灵活的数据标识方式。
示例:
import pandas as pd # 创建一个Series s = pd.Series([10, 20, 30], index=['a', 'b', 'c']) print(s.index) # 输出: Index(['a', 'b', 'c'], dtype='object') # 创建一个DataFrame df = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35] }, index=['one', 'two', 'three']) print(df.index) # 输出: Index(['one', 'two', 'three'], dtype='object')
标签(Label):
定义:在Pandas中,"标签"通常是指数据的具体标识符或名称,用于访问
Series
或DataFrame
中的特定数据。功能:
- 数据访问:通过标签可以直接访问
Series
或DataFrame
中的数据。例如,通过标签获取特定的行或列。 - 行列操作:标签用于进行行和列的操作,比如选择特定的行或列,或对行列进行重命名等。
- 数据访问:通过标签可以直接访问
示例:
import pandas as pd # 创建一个Series s = pd.Series([10, 20, 30], index=['a', 'b', 'c']) print(s['a']) # 输出: 10 # 创建一个DataFrame df = pd.DataFrame({ 'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35] }, index=['one', 'two', 'three']) print(df.loc['one']) # 输出: name Alice\nage 25\nName: one, dtype: object
区别与联系:
相似性:
- 索引和标签都是用来标识数据的,索引是Pandas的核心结构之一,标签是索引的一种具体应用。
- 标签是索引的一部分:在
Series
中,标签通常指的是索引的具体值,用于访问数据。
区别:
- 范围:索引是一种广泛的概念,涉及行索引和列索引,而标签更具体,通常指单个索引值。
- 用途:索引用于整体的标识和数据对齐,而标签更多用于数据的实际访问和操作。
四、常用方法
有很多方法在前面Series和DataFrame的方法表格里面,包括数据的打印预览、索引设置、统计性信息等等,都很常用,这里不重复介绍了。
4.1 数据读取和写入
Pandas支持多种数据格式的读取和写入,包括CSV、Excel、Txt、SQL数据库、JSON、HDF5等。
4.11 🟢CSV文件
也适用于.txt
文件。
读取:
默认将第一行作为列名即列标签,如果本来有列名,又指定了列名,则会把原来的列名当成第一行数据。
import pandas as pd
# 从CSV文件读取数据
df = pd.read_csv('file_path.csv')
# 指定分隔符
df = pd.read_csv('file_path.csv', delimiter=',')
# 指定列名
df = pd.read_csv('file_path.csv', names=['col1', 'col2', 'col3'])
# 指定编码(如果出错):utf-8,ISO-8859-1,latin1,cp1252
df = pd.read_csv('file_path.csv', encoding='utf-8')
# 读取特定列,可以是列索引,也可以是列标签
df = pd.read_csv('file_path.csv', usecols=['col1', 'col2'])
# 将特定列作为索引,可以是列索引,也可以是列标签
df = pd.read_csv('file_path.csv', index_col='A1')
# 将某一列转换为整数
df = pd.read_csv('file_path.csv', converters={'column_name': to_int})
参数,只有文件名是必选。
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
filepath_or_buffer |
str, path-like, file-like | None | 读取的CSV文件路径或文件对象。 |
sep |
str | ‘,’ | 分隔符,用于分隔文件中的字段。 |
delimiter |
str | None | 与 sep 相同,指定字段的分隔符。 |
header |
int, list of int, None | ‘infer’ | 用于指定行号作为列名。如果为None,则默认读取第一行作为列名。 |
names |
array-like | None | 指定列名。如果提供了 header 参数为None,则使用这些列名。 |
index_col |
int, str, sequence of int/str | None | 用作索引的列编号或列名。 |
usecols |
list-like, callable | None | 读取的列。可以是列的编号、名称或一个函数。 |
dtype |
Type name or dict of column -> type | None | 数据类型,用于转换数据。 |
engine |
{‘c’, ‘python’} | ‘c’ | CSV解析器引擎。c 是C语言引擎,python 是Python引擎。 |
skiprows |
int, list-like | None | 跳过的行数或行号列表。 |
skipfooter |
int | 0 | 文件末尾跳过的行数。 |
nrows |
int | None | 读取的行数。 |
na_values |
scalar, str, list-like, dict | None | 指定缺失值的标记。 |
keep_default_na |
bool | True | 是否保留缺失值标记。 |
converters |
dict | None | 列转换函数字典。 |
parse_dates |
bool, list, dict | False | 解析日期列。 |
date_parser |
function | None | 自定义日期解析函数。 |
thousands |
str | None | 数字中的千分位分隔符。 |
comment |
str | None | 用于指定注释的开始字符。 |
encoding |
str | None | 文件的编码格式。 |
encoding_errors |
str | ‘strict’ | 编码错误处理策略。 |
quotechar |
str | ‘"’ | 字符串引用字符。 |
quoting |
int | 0 | 控制字段的引用方式。 |
doublequote |
bool | True | 是否使用双引号来表示包含双引号的字段。 |
escapechar |
str | None | 转义字符。 |
line_terminator |
str | None | 行终止符。 |
skipinitialspace |
bool | False | 是否跳过字段值中的初始空格。 |
skip_blank_lines |
bool | True | 是否跳过空白行。 |
mangle_dupe_cols |
bool | True | 是否处理重复列名。 |
storage_options |
dict | None | 存储选项,用于文件系统或其他外部存储。 |
写入:
# 写入到CSV文件
df.to_csv('file_path.csv', index=False)
# 包含索引
df.to_csv('file_path_with_index.csv', index=True)
# 不写入列名
df.to_csv('file_path_without_header.csv', header=False)
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
path_or_buf |
str, path-like, file-like | None | 要保存的目标路径或文件对象。如果为 None ,则返回字符串。 |
sep |
str | ‘,’ | 字段分隔符,用于分隔文件中的字段。 |
na_rep |
str | ‘’ | 替换缺失值的字符串。 |
float_format |
str | None | 浮点数的格式字符串。 |
columns |
sequence, optional | None | 指定要写入文件的列。如果为 None ,则写入所有列。 |
header |
bool, list of str | True | 是否写入列名。如果为布尔值,表示是否写入列名。如果为列表,指定列名。 |
index |
bool | True | 是否写入行索引。 |
index_label |
str, sequence, or None | None | 行索引的标签。 |
mode |
str | ‘w’ | 文件打开模式。 |
encoding |
str | None | 文件的编码格式。 |
compression |
{‘infer’, ‘bz2’, ‘gzip’, ‘xz’, ‘zip’, None} | None | 文件压缩格式。 |
quotechar |
str | ‘"’ | 字符串引用字符。 |
quoting |
int | 0 | 控制字段的引用方式。 |
line_terminator |
str | None | 行终止符。 |
chunksize |
int | None | 分块大小。如果指定,数据将被分块写入。 |
date_format |
str | None | 日期格式。 |
doublequote |
bool | True | 是否使用双引号来表示包含双引号的字段。 |
escapechar |
str | None | 转义字符。 |
errors |
str | ‘strict’ | 错误处理策略。 |
storage_options |
dict | None | 存储选项,用于文件系统或其他外部存储。 |
4.12🟢Excel文件
读取:
# 从Excel文件读取数据
df = pd.read_excel('file_path.xlsx', sheet_name='Sheet1')
# 读取多个表单
df = pd.read_excel('file_path.xlsx', sheet_name=['Sheet1', 'Sheet2'])
# 读取特定列
df = pd.read_excel('file_path.xlsx', usecols=['col1', 'col2'])
# 读取特定行
df = pd.read_excel('file_path.xlsx', skiprows=5)
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
io |
str, path-like, file-like | None | 要读取的Excel文件路径或文件对象。 |
sheet_name |
str, int, list, None | 0 | 要读取的工作表名或索引,None 读取所有工作表。 |
header |
int, list of int, None | 0 | 用作列名的行号。如果为None,则默认使用第一行作为列名。 |
names |
array-like | None | 指定列名。如果提供了 header 参数为None,则使用这些列名。 |
index_col |
int, str, sequence of int/str | None | 用作索引的列编号或列名。 |
usecols |
list-like, callable | None | 读取的列。可以是列的编号、名称或一个函数。 |
dtype |
Type name or dict of column -> type | None | 数据类型,用于转换数据。 |
engine |
{‘xlrd’, ‘openpyxl’, ‘odf’, ‘pyxlsb’} | None | Excel解析器引擎。选择用于读取Excel文件的引擎。 |
converters |
dict | None | 列转换函数字典。 |
parse_dates |
bool, list, dict | False | 解析日期列。 |
date_parser |
function | None | 自定义日期解析函数。 |
thousands |
str | None | 数字中的千分位分隔符。 |
skiprows |
int, list-like | None | 跳过的行数或行号列表。 |
skipfooter |
int | 0 | 文件末尾跳过的行数。 |
nrows |
int | None | 读取的行数。 |
na_values |
scalar, str, list-like, dict | None | 指定缺失值的标记。 |
keep_default_na |
bool | True | 是否保留缺失值标记。 |
convert_float |
bool | True | 是否将浮点数转换为float类型。 |
json_normalize |
bool | False | 是否将嵌套JSON数据展平。 |
storage_options |
dict | None | 存储选项,用于文件系统或其他外部存储。 |
写入:
# 写入到Excel文件
df.to_excel('file_path.xlsx', sheet_name='Sheet1', index=False)
# 写入多个表单
with pd.ExcelWriter('file_path.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet2', index=False)
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
excel_writer |
str, ExcelWriter | None | Excel文件路径或 ExcelWriter 对象,用于保存文件。 |
sheet_name |
str | ‘Sheet1’ | 要写入的工作表名称。 |
na_rep |
str | ‘’ | 替换缺失值的字符串。 |
float_format |
str | None | 浮点数的格式字符串。 |
columns |
sequence, optional | None | 指定要写入文件的列。如果为 None ,则写入所有列。 |
header |
bool, list of str | True | 是否写入列名。如果为布尔值,表示是否写入列名。如果为列表,指定列名。 |
index |
bool | True | 是否写入行索引。 |
index_label |
str, sequence, or None | None | 行索引的标签。 |
startrow |
int | 0 | 写入数据的起始行。 |
startcol |
int | 0 | 写入数据的起始列。 |
engine |
{‘xlsxwriter’, ‘openpyxl’, ‘odf’, ‘xlwt’} | None | Excel写入引擎。选择用于写入Excel文件的引擎。 |
merge_cells |
bool | True | 是否合并单元格。 |
encoding |
str | None | 文件的编码格式。 |
date_format |
str | None | 日期格式。 |
datetime_format |
str | None | datetime 对象的格式。 |
sheet_name |
str | ‘Sheet1’ | 要写入的工作表名称。 |
engine |
{‘xlsxwriter’, ‘openpyxl’, ‘odf’, ‘xlwt’} | None | Excel写入引擎。选择用于写入Excel文件的引擎。 |
options |
dict | None | 存储选项,用于文件系统或其他外部存储。 |
4.13 其它文件
(1)SQL数据库
from sqlalchemy import create_engine
# 创建数据库连接
engine = create_engine('sqlite:///database.db')
# 从SQL数据库读取数据
df = pd.read_sql('SELECT * FROM table_name', con=engine)
# 读取指定列
df = pd.read_sql('SELECT col1, col2 FROM table_name', con=engine)
# 将DataFrame写入SQL数据库
df.to_sql('table_name', con=engine, if_exists='replace', index=False)
# if_exists参数:
# 'fail' - 如果表存在,则抛出ValueError
# 'replace' - 如果表存在,删除表后写入
# 'append' - 如果表存在,数据追加到表中
(2)JSON
# 从JSON文件读取数据
df = pd.read_json('file_path.json')
# 读取JSON文件的特定部分
df = pd.read_json('file_path.json', orient='records')
# 写入到JSON文件
df.to_json('file_path.json', orient='records', lines=True)
# orient参数:
# 'split' - 分割格式
# 'records' - 记录格式
# 'index' - 索引格式
# 'columns' - 列格式
# 'values' - 值格式
还有好多其它格式,不展开了。
4.2 字符串处理
在 pandas
中,字符串处理可以通过 Series
对象的 .str
属性来进行。这个属性提供了一系列用于处理字符串的方便方法。
方法名 | 描述 | 示例代码 |
---|---|---|
str.lower() |
将字符串转换为小写字母。 | df['col'].str.lower() |
str.upper() |
将字符串转换为大写字母。 | df['col'].str.upper() |
str.title() |
将字符串的每个单词首字母大写。 | df['col'].str.title() |
str.capitalize() |
将字符串的首字母大写,其余字母小写。 | df['col'].str.capitalize() |
str.strip() |
去除字符串两端的空白字符。 | df['col'].str.strip() |
str.lstrip() |
去除字符串左侧的空白字符。 | df['col'].str.lstrip() |
str.rstrip() |
去除字符串右侧的空白字符。 | df['col'].str.rstrip() |
str.replace() |
替换字符串中的指定子字符串。 | df['col'].str.replace('old', 'new') |
str.find() |
查找子字符串的位置,如果不存在则返回 -1。 | df['col'].str.find('substring') |
str.contains() |
检查字符串中是否包含指定的子字符串。 | df['col'].str.contains('substring') |
str.startswith() |
检查字符串是否以指定子字符串开头。 | df['col'].str.startswith('prefix') |
str.endswith() |
检查字符串是否以指定子字符串结尾。 | df['col'].str.endswith('suffix') |
str.split() |
根据指定的分隔符拆分字符串,返回一个列表。 | df['col'].str.split(',') |
str.join() |
将列表中的字符串用指定分隔符连接成一个字符串。 | df['col'].str.join(',') |
str.extract() |
使用正则表达式提取匹配的子字符串。 | df['col'].str.extract(r'(\d+)') |
str.findall() |
使用正则表达式查找所有匹配的子字符串。 | df['col'].str.findall(r'\d+') |
str.zfill() |
在字符串的左侧填充零,使其达到指定的宽度。 | df['col'].str.zfill(5) |
str.isalpha() |
检查字符串是否仅包含字母。 | df['col'].str.isalpha() |
str.isdigit() |
检查字符串是否仅包含数字。 | df['col'].str.isdigit() |
str.isnumeric() |
检查字符串是否仅包含数字字符。 | df['col'].str.isnumeric() |
str.islower() |
检查字符串是否仅包含小写字母。 | df['col'].str.islower() |
str.isupper() |
检查字符串是否仅包含大写字母。 | df['col'].str.isupper() |
4.3 表格拼接
在 pandas
中,表格拼接主要通过以下方法实现:
concat
:用于沿指定轴(行或列)将多个 DataFrame 连接在一起。append
:用于将一个 DataFrame 添加到另一个 DataFrame 的末尾,实际上是concat
的一种快捷方式。merge
:用于通过一个或多个键将两个 DataFrame 进行连接,类似于 SQL 中的 JOIN 操作。join
:用于将两个 DataFrame 进行基于索引的连接,类似于merge
,但通常用于基于索引的连接。
是Series、DataFrame之间拼接,不能直接把列表这些和它们拼接。
add = ['Alice', 'hello', 'Ha', 'Nice']
df['A4'] = pd.Series(add)
🟢concat:
concat
方法用于沿指定轴将多个 DataFrame 合并在一起,可以处理不同的轴和连接方式(如外连接、内连接)。
主要参数:
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
objs |
list of DataFrame | None | 要拼接的 DataFrame 对象列表。 |
axis |
int | 0 | 指定拼接的轴,0 为行方向(增加行数),1 为列方向(增加列数)。 |
join |
{‘inner’, ‘outer’} | ‘outer’ | 指定连接方式,'inner' 表示内连接,'outer' 表示外连接。 |
ignore_index |
bool | False | 是否忽略原有的行索引,重新生成新的行索引。 |
keys |
list | None | 生成层次化索引的键。 |
示例:
import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
# 沿行方向拼接
result = pd.concat([df1, df2], axis=0, ignore_index=True)
print(result)
输出:
A B
0 A0 B0
1 A1 B1
2 A2 B2
3 A3 B3
🟢append:
append
方法用于将一个 DataFrame 追加到另一个 DataFrame 的末尾。它是 concat
的简化版本,主要用于行拼接(增加行数)。
示例:
import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
# 追加 df2 到 df1
result = df1.append(df2, ignore_index=True)
print(result)
输出:
A B
0 A0 B0
1 A1 B1
2 A2 B2
3 A3 B3
🟢merge:
merge
用于通过一个或多个键将两个 DataFrame 进行连接,支持多种合并方式,包括内连接、外连接、左连接和右连接。
主要参数:
参数名 | 类型 | 默认值 | 描述 |
---|---|---|---|
left |
DataFrame | None | 左侧 DataFrame。 |
right |
DataFrame | None | 右侧 DataFrame。 |
how |
{‘left’, ‘right’, ‘outer’, ‘inner’} | ‘inner’ | 合并方式:'left' 、'right' 、'outer' 、'inner' 。 |
on |
str, list of str | None | 用于合并的列名。如果列名不同,可以使用 left_on 和 right_on 参数。 |
left_on |
str, list of str | None | 左侧 DataFrame 中用于合并的列名。 |
right_on |
str, list of str | None | 右侧 DataFrame 中用于合并的列名。 |
left_index |
bool | False | 是否使用左侧 DataFrame 的索引进行合并。 |
right_index |
bool | False | 是否使用右侧 DataFrame 的索引进行合并。 |
示例代码:
import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value1': [1, 2, 3]})
df2 = pd.DataFrame({'key': ['B', 'C', 'D'], 'value2': [4, 5, 6]})
# 内连接
result = pd.merge(df1, df2, on='key', how='inner')
print(result)
输出:
key value1 value2
0 B 2 4
1 C 3 5
🟢join:
join
方法用于基于索引连接两个 DataFrame,通常用于索引对齐。
示例代码:
import pandas as pd
# 创建示例 DataFrame
df1 = pd.DataFrame({'A': [1, 2, 3]}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({'B': [4, 5]}, index=['b', 'c'])
# 使用 join 基于索引连接
result = df1.join(df2)
print(result)
输出:
A B
a 1 NaN
b 2 4.0
c 3 5.0
4.4 时间数据处理
(1)解析和创建日期时间数据
方法/属性 | 主要参数 | 描述 |
---|---|---|
pd.to_datetime |
arg , format , errors |
将日期时间字符串转换为 datetime 对象。 |
pd.date_range |
start , end , freq , periods |
创建指定频率的日期时间索引。 |
(2)日期时间属性访问
方法/属性 | 主要参数 | 描述 |
---|---|---|
.dt.year |
- | 获取年份 |
.dt.month |
- | 获取月份 |
.dt.day |
- | 获取日期 |
.dt.hour |
- | 获取小时 |
.dt.minute |
- | 获取分钟 |
.dt.second |
- | 获取秒数 |
.dt.weekday() |
- | 获取星期几,0 表示星期一 |
.dt.strftime() |
format |
按指定格式格式化日期时间对象为字符串。 |
(3)时间差和时间计算
方法/属性 | 主要参数 | 描述 |
---|---|---|
Timedelta |
days , hours , minutes |
创建时间差对象。 |
pd.DateOffset |
days , months , years |
创建日期偏移对象,添加或减去时间。 |
(4)日期时间索引和重采样
方法/属性 | 主要参数 | 描述 |
---|---|---|
pd.date_range |
start , end , freq , periods |
创建日期时间索引。 |
.resample() |
rule , how |
对时间序列数据进行重采样。 |
.asfreq() |
freq , fill_value |
设置时间序列的频率,选择填充值。 |
(5)日期时间格式化
方法/属性 | 主要参数 | 描述 |
---|---|---|
.strftime() |
format |
按指定格式将日期时间对象格式化为字符串。 |
(6) 时间窗口操作
方法/属性 | 主要参数 | 描述 |
---|---|---|
.rolling() |
window , min_periods |
创建滚动窗口。 |
.sum() |
- | 计算滚动窗口的总和。 |
.mean() |
- | 计算滚动窗口的均值。 |
.apply() |
func |
对滚动窗口应用自定义函数。 |
format
: 指定格式的字符串。可以包含以下格式符号:
符号 | 描述 | 示例 |
---|---|---|
%Y |
年(四位数字) | 2024 |
%m |
月(两位数字) | 07 |
%d |
日(两位数字) | 22 |
%H |
小时(24小时制) | 10 |
%M |
分钟 | 30 |
%S |
秒数 | 45 |
%f |
微秒 | 123456 |
%a |
星期几(缩写) | Mon |
%A |
星期几(全名) | Monday |
%b |
月份(缩写) | Jul |
%B |
月份(全名) | July |
import pandas as pd
ts = pd.Timestamp('2024-07-22 10:30:45')
print(ts.strftime('%Y-%m-%d')) # 2024-07-22
print(ts.strftime('%d/%m/%Y')) # 22/07/2024
print(ts.strftime('%I:%M %p')) # 10:30 AM