【Python】Pandas简要教程

文章目录

一、简介

Pandas 是一个用于数据操作和分析的开源 Python 库。它提供了高效的数据结构和数据分析工具,特别适合处理结构化数据(如表格数据)。Pandas 在数据清洗、预处理、统计分析、数据可视化等方面有广泛的应用。

Github:https://github.com/pandas-dev/pandas

User Guide:https://pandas.pydata.org/docs/user_guide/index.html

主要特点:

  1. 易用的数据结构

    • Series:一维数组,类似于 Python 的列表或字典。
    • DataFrame:二维数据结构,类似于 Excel 表格或 SQL 表。
  2. 数据操作

    • 支持对数据进行增删改查操作。
    • 提供丰富的数据清洗和预处理功能,包括缺失值处理、数据过滤、分组、聚合等。
    • 支持多种数据格式的读写,如 CSV、Excel、SQL、JSON 等。
  3. 高效的性能

    • 基于 NumPy 实现,具有高效的计算性能。
    • 支持多种加速库,如 Dask、Modin,可以在大数据处理时提升性能。
  4. 数据可视化

    • 与 Matplotlib、Seaborn 等可视化库无缝集成,方便生成各种类型的图表。

二、Pandas基本数据结构及其方法

2.1 Series

pd.Series是Pandas库中的一种基本数据结构,用于表示一维的带标签数组。它既可以包含整数、浮点数、字符串等数据类型,也可以包含其他Python对象。

可以通过多种方式创建一个Series:

python 复制代码
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

  1. 通过字典创建

    python 复制代码
    data = {
        'name': ['Alice', 'Bob', 'Charlie'],
        'age': [25, 30, 35],
        'city': ['New York', 'San Francisco', 'Los Angeles']
    }
    df = pd.DataFrame(data)
  2. 通过列表的列表创建

    python 复制代码
    data = [['Alice', 25, 'New York'],
            ['Bob', 30, 'San Francisco'],
            ['Charlie', 35, 'Los Angeles']]
    columns = ['name', 'age', 'city']
    df = pd.DataFrame(data, columns=columns)
  3. 通过字典的字典创建

    python 复制代码
    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)
  4. 通过numpy数组创建

    python 复制代码
    data = np.array([['Alice', 25, 'New York'],
                     ['Bob', 30, 'San Francisco'],
                     ['Charlie', 35, 'Los Angeles']])
    df = pd.DataFrame(data, columns=['name', 'age', 'city'])

输出:

bash 复制代码
      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中,"索引"指的是用于标识数据的位置的标签。它可以是行索引(对于DataFrameSeries的行)或列索引(对于DataFrame的列)。

  • 功能:

    • 定位和访问数据:索引用于定位和访问数据。例如,通过行索引,可以快速访问特定行的数据。
    • 对齐数据:在进行数据合并、对齐等操作时,Pandas会自动对齐索引,以确保数据一致性。
    • 标签的灵活性:索引不仅可以是整数,还可以是字符串、日期、时间等类型,提供了灵活的数据标识方式。
  • 示例:

    python 复制代码
    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中,"标签"通常是指数据的具体标识符或名称,用于访问SeriesDataFrame中的特定数据。

  • 功能:

    • 数据访问:通过标签可以直接访问SeriesDataFrame中的数据。例如,通过标签获取特定的行或列。
    • 行列操作:标签用于进行行和列的操作,比如选择特定的行或列,或对行列进行重命名等。
  • 示例:

    python 复制代码
    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

区别与联系:

  1. 相似性:

    • 索引和标签都是用来标识数据的,索引是Pandas的核心结构之一,标签是索引的一种具体应用。
    • 标签是索引的一部分:在Series中,标签通常指的是索引的具体值,用于访问数据。
  2. 区别:

    • 范围:索引是一种广泛的概念,涉及行索引和列索引,而标签更具体,通常指单个索引值。
    • 用途:索引用于整体的标识和数据对齐,而标签更多用于数据的实际访问和操作。

四、常用方法

有很多方法在前面Series和DataFrame的方法表格里面,包括数据的打印预览、索引设置、统计性信息等等,都很常用,这里不重复介绍了。

4.1 数据读取和写入

Pandas支持多种数据格式的读取和写入,包括CSV、Excel、Txt、SQL数据库、JSON、HDF5等。

4.11 🟢CSV文件

也适用于.txt文件。

读取:

默认将第一行作为列名即列标签,如果本来有列名,又指定了列名,则会把原来的列名当成第一行数据。

python 复制代码
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 存储选项,用于文件系统或其他外部存储。

写入:

python 复制代码
# 写入到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文件

读取:

python 复制代码
# 从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 存储选项,用于文件系统或其他外部存储。

写入:

python 复制代码
# 写入到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数据库

python 复制代码
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

python 复制代码
# 从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 中,表格拼接主要通过以下方法实现:

  1. concat:用于沿指定轴(行或列)将多个 DataFrame 连接在一起。
  2. append :用于将一个 DataFrame 添加到另一个 DataFrame 的末尾,实际上是 concat 的一种快捷方式。
  3. merge:用于通过一个或多个键将两个 DataFrame 进行连接,类似于 SQL 中的 JOIN 操作。
  4. join :用于将两个 DataFrame 进行基于索引的连接,类似于 merge,但通常用于基于索引的连接。

是Series、DataFrame之间拼接,不能直接把列表这些和它们拼接。

python 复制代码
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 生成层次化索引的键。

示例:

python 复制代码
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)

输出:

bash 复制代码
    A   B
0  A0  B0
1  A1  B1
2  A2  B2
3  A3  B3

🟢append:

append 方法用于将一个 DataFrame 追加到另一个 DataFrame 的末尾。它是 concat 的简化版本,主要用于行拼接(增加行数)。

示例:

python 复制代码
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)

输出:

bash 复制代码
    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_onright_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 的索引进行合并。

示例代码:

python 复制代码
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)

输出:

bash 复制代码
  key  value1  value2
0   B       2       4
1   C       3       5

🟢join:

join 方法用于基于索引连接两个 DataFrame,通常用于索引对齐。

示例代码:

python 复制代码
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)

输出:

bahs 复制代码
   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
python 复制代码
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大数据分析@3 分钟前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树4 分钟前
简单的签到程序 python笔记
笔记·python
Shy96041817 分钟前
Bert完形填空
python·深度学习·bert
上海_彭彭28 分钟前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element
3345543236 分钟前
element动态表头合并表格
开发语言·javascript·ecmascript
沈询-阿里40 分钟前
java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl
java·开发语言
zhongcx0144 分钟前
使用Python查找大文件的实用脚本
python
残月只会敲键盘1 小时前
面相小白的php反序列化漏洞原理剖析
开发语言·php
ac-er88881 小时前
PHP弱类型安全问题
开发语言·安全·php
ac-er88881 小时前
PHP网络爬虫常见的反爬策略
开发语言·爬虫·php