#GPT辅助学习 数据结构与API:pandas
Pandas 的核心数据模型主要有两个:Series
和 DataFrame
。
-
Series:
Series
是一个一维的数据结构,可以理解为带有标签的一维数组。标签可以是数字或字符串。- 每个
Series
对象包含两部分:数据 (values) 和索引 (index)。 - 示例:
import pandas as pd s = pd.Series([1, 2, 3], index=['a', 'b', 'c']) print(s) # 输出: # a 1 # b 2 # c 3 # dtype: int64
-
DataFrame:
DataFrame
是一个二维的表格型数据结构,可以理解为带有标签的二维数组。每列可以有不同的数据类型。- 每个
DataFrame
对象包含三部分:数据 (values)、行索引 (index) 和列标签 (columns)。 - 示例:
import pandas as pd data = { 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] } df = pd.DataFrame(data) print(df) # 输出: # A B C # 0 1 4 7 # 1 2 5 8 # 2 3 6 9
API 理解
Pandas 围绕这两个核心数据模型提供了一系列操作和处理数据的方法。以下是一些关键 API 及其理解:
-
创建对象:
pd.Series(data, index=index)
: 创建一个Series
对象。pd.DataFrame(data, index=index, columns=columns)
: 创建一个DataFrame
对象。
-
索引与选择数据:
s[index]
: 通过索引选择Series
中的数据。df[col]
: 选择DataFrame
中的一列,返回一个Series
。df.loc[label]
: 通过标签选择行。df.iloc[pos]
: 通过位置选择行。
-
数据操作:
df.head(n)
: 返回前n
行。df.tail(n)
: 返回后n
行。df.describe()
: 快速统计摘要。df.T
: 转置DataFrame
。df.sort_values(by, axis, ascending)
: 按值排序。
-
数据清洗:
df.isnull()
: 检查缺失值。df.dropna()
: 删除缺失值。df.fillna(value)
: 填充缺失值。
-
数据合并:
pd.concat(objs, axis)
: 沿指定轴连接对象。pd.merge(left, right, how, on)
: 合并两个DataFrame
对象。
-
数据分组:
df.groupby(by)
: 对数据进行分组。df.agg(func)
: 聚合操作。
这些 API 提供了强大的数据处理能力,使用户能够方便地进行数据分析和操作。
Pandas 提供了强大的功能来读取和写入多种数据格式,包括 CSV、Excel 和 SQL。以下是它们之间的一些对比和使用示例:
1. CSV
特点:
- 常用的文本文件格式,易于查看和编辑。
- 适合小规模数据传输和存储。
读取方法:
import pandas as pd
# 读取 CSV 文件
df_csv = pd.read_csv('data.csv')
写入方法:
# 写入 CSV 文件
df_csv.to_csv('output.csv', index=False)
优点:
- 简单、轻量级。
- 广泛支持。
缺点:
- 不支持复杂的数据类型(如日期、公式)。
- 文件大小较大,读取速度相对较慢。
2. Excel
特点:
- 广泛使用的电子表格格式,适合数据展示和报告。
- 支持复杂的数据类型和格式(如日期、公式、样式)。
读取方法:
import pandas as pd
# 读取 Excel 文件
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')
写入方法:
# 写入 Excel 文件
df_excel.to_excel('output.xlsx', index=False, sheet_name='Sheet1')
优点:
- 支持丰富的数据格式和样式。
- 更适合数据展示和报告。
缺点:
- 文件较大,处理速度相对较慢。
- 需要安装额外的库(如
openpyxl
、xlrd
)来读取和写入。
3. SQL
特点:
- 用于管理和查询大型结构化数据的关系型数据库。
- 支持复杂的查询和操作。
读取方法:
import pandas as pd
import sqlite3
# 创建数据库连接
conn = sqlite3.connect('database.db')
# 从 SQL 数据库读取数据
df_sql = pd.read_sql_query('SELECT * FROM table_name', conn)
写入方法:
# 将 DataFrame 写入 SQL 数据库
df_sql.to_sql('table_name', conn, if_exists='replace', index=False)
优点:
- 适合大规模数据存储和复杂查询。
- 支持事务和并发访问。
缺点:
- 需要数据库服务器和配置。
- 需要了解 SQL 语法。
对比总结
特性 | CSV | Excel | SQL |
---|---|---|---|
文件大小 | 较大 | 较大 | 取决于数据库 |
读取速度 | 较慢 | 较慢 | 较快(视查询复杂度而定) |
复杂数据类型支持 | 低 | 高 | 高 |
易用性 | 高 | 中 | 低 |
使用场景 | 小规模数据传输与存储 | 数据展示与报告 | 大规模数据存储与复杂查询 |
额外依赖 | 无 | 需要 openpyxl 或 xlrd |
需要数据库和驱动程序 |
不同的格式有各自的优缺点和适用场景,选择时应根据具体需求和数据特点来决定。
pandas
中的 reindex
方法用于对行和列重新索引。它允许你根据指定的新索引创建一个新对象,并且可以在现有数据中引入缺失值以适应新的索引。
主要用途
- 对行或列进行重新排序。
- 插入新的索引标签,导致相应位置上会引入缺失值。
- 对齐不同索引的对象。
基本语法
DataFrame.reindex(index=None, columns=None, **kwargs)
index
:新的行索引。columns
:新的列索引。**kwargs
:其他可选参数,如method
(填充方法)、fill_value
(缺失值填充)、limit
(最大填充数量)等。
示例说明
重新排序行和列
import pandas as pd
# 创建示例 DataFrame
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}, index=['a', 'b', 'c'])
print("原始 DataFrame:")
print(df)
# 重新索引
df_reindexed = df.reindex(index=['c', 'b', 'a'], columns=['C', 'B', 'A'])
print("\n重新索引后的 DataFrame:")
print(df_reindexed)
输出:
原始 DataFrame:
A B C
a 1 4 7
b 2 5 8
c 3 6 9
重新索引后的 DataFrame:
C B A
c 9 6 3
b 8 5 2
a 7 4 1
插入新的索引标签
import pandas as pd
# 创建示例 Series
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
print("原始 Series:")
print(s)
# 重新索引,插入新的索引标签
s_reindexed = s.reindex(['a', 'b', 'c', 'd', 'e'])
print("\n重新索引后的 Series:")
print(s_reindexed)
输出:
原始 Series:
a 1
b 2
c 3
dtype: int64
重新索引后的 Series:
a 1.0
b 2.0
c 3.0
d NaN
e NaN
dtype: float64
填充缺失值
import pandas as pd
# 创建示例 Series
s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
print("原始 Series:")
print(s)
# 重新索引并填充缺失值
s_reindexed = s.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0)
print("\n重新索引并填充缺失值后的 Series:")
print(s_reindexed)
输出:
原始 Series:
a 1
b 2
c 3
dtype: int64
重新索引并填充缺失值后的 Series:
a 1
b 2
c 3
d 0
e 0
dtype: int64
总结
reindex
是一个强大的工具,用于调整 DataFrame
或 Series
的索引和列标签。通过它可以重新排序数据、插入新的索引标签以及填充缺失值,从而实现数据的对齐和清洗。
在 pandas
中,merge
和 concat
是两个常用的用于合并数据的方法。它们各自有不同的用途和特性。
pandas.merge
merge
用于根据一个或多个键将两个数据集结合在一起,类似于 SQL 中的 JOIN 操作。
基本语法:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, ...)
# 主要参数:
# - left: 左侧的 DataFrame
# - right: 右侧的 DataFrame
# - how: 合并方式('left', 'right', 'outer', 'inner')
# - on: 用于连接的列名称(相同名称)
# - left_on: 左侧用于连接的列名称(如果列名不同)
# - right_on: 右侧用于连接的列名称(如果列名不同)
示例:
-
基于一个键进行合并:
import pandas as pd df1 = pd.DataFrame({ 'key': ['A', 'B', 'C', 'D'], 'value1': [1, 2, 3, 4] }) df2 = pd.DataFrame({ 'key': ['B', 'D', 'E', 'F'], 'value2': [5, 6, 7, 8] }) result = pd.merge(df1, df2, on='key', how='inner') print(result)
输出:
key value1 value2 0 B 2 5 1 D 4 6
-
基于多个键进行合并:
df1 = pd.DataFrame({ 'key1': ['A', 'B', 'C', 'D'], 'key2': ['W', 'X', 'Y', 'Z'], 'value1': [1, 2, 3, 4] }) df2 = pd.DataFrame({ 'key1': ['A', 'B', 'C', 'D'], 'key2': ['W', 'X', 'Y', 'Q'], 'value2': [5, 6, 7, 8] }) result = pd.merge(df1, df2, on=['key1', 'key2'], how='outer') print(result)
输出:
key1 key2 value1 value2 0 A W 1.0 5.0 1 B X 2.0 6.0 2 C Y 3.0 7.0 3 D Z 4.0 NaN 4 D Q NaN 8.0
pandas.concat
concat
用于沿指定轴将多个对象结合在一起。通常用于简单的行或列连接。
基本语法:
pd.concat(objs, axis=0, join='outer', ignore_index=False, ...)
# 主要参数:
# - objs: 需要合并的对象序列(如 DataFrame 列表)
# - axis: 合并方向(0 为行,1 为列)
# - join: 合并方式('inner' 或 'outer')
# - ignore_index: 是否忽略索引
示例:
-
沿行方向合并(续):
df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2'] }) df2 = pd.DataFrame({ 'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5'] }) result = pd.concat([df1, df2], axis=0) print(result)
输出:
A B 0 A0 B0 1 A1 B1 2 A2 B2 0 A3 B3 1 A4 B4 2 A5 B5
-
沿列方向合并:
df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2'] }) df2 = pd.DataFrame({ 'C': ['C0', 'C1', 'C2'], 'D': ['D0', 'D1', 'D2'] }) result = pd.concat([df1, df2], axis=1) print(result)
输出:
A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2
-
使用
ignore_index
忽略索引:df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2'] }) df2 = pd.DataFrame({ 'A': ['A3', 'A4', 'A5'], 'B': ['B3', 'B4', 'B5'] }) 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 4 A4 B4 5 A5 B5
-
内连接和外连接:
df1 = pd.DataFrame({ 'A': ['A0', 'A1', 'A2'], 'B': ['B0', 'B1', 'B2'] }) df2 = pd.DataFrame({ 'B': ['B2', 'B3', 'B4'], 'C': ['C2', 'C3', 'C4'] }) outer_result = pd.concat([df1, df2], axis=1, join='outer') inner_result = pd.concat([df1, df2], axis=1, join='inner') print("Outer Join:") print(outer_result) print("\nInner Join:") print(inner_result)
输出:
Outer Join: A B B C 0 A0 B0 NaN NaN 1 A1 B1 NaN NaN 2 A2 B2 B2 C2 3 NaN NaN B3 C3 4 NaN NaN B4 C4 Inner Join: A B B C 2 A2 B2 B2 C2
总结
merge
通常用于基于一个或多个键将两个DataFrame
合并在一起,类似于数据库中的 JOIN 操作。它支持多种合并方式,如 inner join、left join、right join 和 outer join。concat
通常用于将多个DataFrame
或Series
沿指定轴(行或列)合并在一起。它适用于简单的连接操作,且可以忽略索引,支持内连接和外连接。
根据具体需求选择使用 merge
还是 concat
,它们各自提供了灵活而强大的数据合并能力。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix