首页 > Python资料 博客日记
【Python】Pandas简要教程
2024-10-11 13:00:05Python资料围观38次
文章目录
一、简介
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
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj