文章目录
- 一、简介
- 二、Pandas基本数据结构及其方法
- 2.1 Series
- 2.2 DataFrame
 
- 三、标签和索引
- 四、常用方法
- 4.1 数据读取和写入
- 4.11 🟢CSV文件
- 4.12🟢Excel文件
- 4.13 其它文件
 
- 4.2 字符串处理
- 4.3 表格拼接
- 4.4 时间数据处理
 
一、简介
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 pdts = 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