1 Pandas的数据结构
1.1 Series
特点:一维的数据型对象,包含一个值序列和数据标签(即索引)
创建Series:
pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
参数说明:
data
:Series 的数据部分,可以是列表、数组、字典、标量值等。如果不提供此参数,则创建一个空的 Series。index
:Series 的索引部分,用于对数据进行标记。可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。dtype
:指定 Series 的数据类型。可以是 NumPy 的数据类型,例如np.int64
、np.float64
等。如果不提供此参数,则根据数据自动推断数据类型。name
:Series 的名称,用于标识 Series 对象。如果提供了此参数,则创建的 Series 对象将具有指定的名称。copy
:是否复制数据。默认为 False,表示不复制数据。如果设置为 True,则复制输入的数据。fastpath
:是否启用快速路径。默认为 False。启用快速路径可能会在某些情况下提高性能。
常用方法:
Series 方法
下面是 Series 中一些常用的方法:
方法名称 | 功能描述 |
---|---|
index | 获取 Series 的索引 |
values | 获取 Series 的数据部分(返回 NumPy 数组) |
head(n) | 返回 Series 的前 n 行(默认为 5) |
tail(n) | 返回 Series 的后 n 行(默认为 5) |
dtype | 返回 Series 中数据的类型 |
shape | 返回 Series 的形状(行数) |
describe() | 返回 Series 的统计描述(如均值、标准差、最小值等) |
isnull() | 返回一个布尔 Series,表示每个元素是否为 NaN |
notnull() | 返回一个布尔 Series,表示每个元素是否不是 NaN |
unique() | 返回 Series 中的唯一值(去重) |
value_counts() | 返回 Series 中每个唯一值的出现次数 |
map(func) | 将指定函数应用于 Series 中的每个元素 |
apply(func) | 将指定函数应用于 Series 中的每个元素,常用于自定义操作 |
astype(dtype) | 将 Series 转换为指定的类型 |
sort_values() | 对 Series 中的元素进行排序(按值排序) |
sort_index() | 对 Series 的索引进行排序 |
dropna() | 删除 Series 中的缺失值(NaN) |
fillna(value) | 填充 Series 中的缺失值(NaN) |
replace(to_replace, value) | 替换 Series 中指定的值 |
cumsum() | 返回 Series 的累计求和 |
cumprod() | 返回 Series 的累计乘积 |
shift(periods) | 将 Series 中的元素按指定的步数进行位移 |
rank() | 返回 Series 中元素的排名 |
corr(other) | 计算 Series 与另一个 Series 的相关性(皮尔逊相关系数) |
cov(other) | 计算 Series 与另一个 Series 的协方差 |
to_list() | 将 Series 转换为 Python 列表 |
to_frame() | 将 Series 转换为 DataFrame |
iloc[] | 通过位置索引来选择数据 |
loc[] | 通过标签索引来选择数据 |
1.2 DataFrame
构造方法:
pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
参数说明:
data
:DataFrame 的数据部分,可以是字典、二维数组、Series、DataFrame 或其他可转换为 DataFrame 的对象。如果不提供此参数,则创建一个空的 DataFrame。index
:DataFrame 的行索引,用于标识每行数据。可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。columns
:DataFrame 的列索引,用于标识每列数据。可以是列表、数组、索引对象等。如果不提供此参数,则创建一个默认的整数索引。dtype
:指定 DataFrame 的数据类型。可以是 NumPy 的数据类型,例如np.int64
、np.float64
等。如果不提供此参数,则根据数据自动推断数据类型。copy
:是否复制数据。默认为 False,表示不复制数据。如果设置为 True,则复制输入的数据。
DataFrame 方法
DataFrame 的常用操作和方法如下表所示:
方法名称 | 功能描述 |
---|---|
head(n) | 返回 DataFrame 的前 n 行数据(默认前 5 行) |
tail(n) | 返回 DataFrame 的后 n 行数据(默认后 5 行) |
info() | 显示 DataFrame 的简要信息,包括列名、数据类型、非空值数量等 |
describe() | 返回 DataFrame 数值列的统计信息,如均值、标准差、最小值等 |
shape | 返回 DataFrame 的行数和列数(行数, 列数) |
columns | 返回 DataFrame 的所有列名 |
index | 返回 DataFrame 的行索引 |
dtypes | 返回每一列的数值数据类型 |
sort_values(by) | 按照指定列排序 |
sort_index() | 按行索引排序 |
dropna() | 删除含有缺失值(NaN)的行或列 |
fillna(value) | 用指定的值填充缺失值 |
isnull() | 判断缺失值,返回一个布尔值 DataFrame |
notnull() | 判断非缺失值,返回一个布尔值 DataFrame |
loc[] | 按标签索引选择数据 |
iloc[] | 按位置索引选择数据 |
at[] | 访问 DataFrame 中单个元素(比 loc[] 更高效) |
iat[] | 访问 DataFrame 中单个元素(比 iloc[] 更高效) |
apply(func) | 对 DataFrame 或 Series 应用一个函数 |
applymap(func) | 对 DataFrame 的每个元素应用函数(仅对 DataFrame) |
groupby(by) | 分组操作,用于按某一列分组进行汇总统计 |
pivot_table() | 创建透视表 |
merge() | 合并多个 DataFrame(类似 SQL 的 JOIN 操作) |
concat() | 按行或按列连接多个 DataFrame |
to_csv() | 将 DataFrame 导出为 CSV 文件 |
to_excel() | 将 DataFrame 导出为 Excel 文件 |
to_json() | 将 DataFrame 导出为 JSON 格式 |
to_sql() | 将 DataFrame 导出为 SQL 数据库 |
query() | 使用 SQL 风格的语法查询 DataFrame |
duplicated() | 返回布尔值 DataFrame,指示每行是否是重复的 |
drop_duplicates() | 删除重复的行 |
set_index() | 设置 DataFrame 的索引 |
reset_index() | 重置 DataFrame 的索引 |
transpose() | 转置 DataFrame(行列交换) |
数据选择和切片
函数 | 说明 |
---|---|
df[column_name] | 选择指定的列; |
df.loc[row_index, column_name] | 通过标签选择数据; |
df.iloc[row_index, column_index] | 通过位置选择数据; |
df.ix[row_index, column_name] | 通过标签或位置选择数据; |
df.filter(items=[column_name1, column_name2]) | 选择指定的列; |
df.filter(regex='regex') | 选择列名匹配正则表达式的列; |
df.sample(n) | 随机选择 n 行数据。 |
索引设置
将索引重置成自然数-reset_index()
pandas中将索引重置成自然数的方法,不会改变原始数据的内容和排列顺序。
import pandas as pd
import numpy as np
print("\n")
print("reset_index")
df = pd.DataFrame({'Col-1': [1, 3, 5], 'Col-2': [5, 7, 9]}, index=['A', 'B', 'C'])
print("df:\n",df)
df1 = df.reset_index()
print("df1:\n",df1)
print("drop=True:\n",df.reset_index(drop=True))
'''
输出结果:
reset_index
df:
Col-1 Col-2
A 1 5
B 3 7
C 5 9
df1:
index Col-1 Col-2
0 A 1 5
1 B 3 7
2 C 5 9
drop=True:
Col-1 Col-2
0 1 5
1 3 7
2 5 9
'''
按照指定索引对齐当前数据-reindex()
reindex()是pandas中实现数据对齐的基本方法,对齐是指沿着指定轴,让数据与给定的一组标签(行列索引)进行匹配。
import pd as pandas
print("\n")
df = pd.DataFrame({'Col-1': [1, 3, 5], 'Col-2': [5, 7, 9]}, index=['A', 'B', 'C'])
print("df:\n",df)
# 默认传给labels参数
df2 = df.reindex(['C', 'B', 'A'])
print("df2:\n",df2)
'''
输出结果:
df:
Col-1 Col-2
A 1 5
B 3 7
C 5 9
df2:
Col-1 Col-2
C 5 9
B 3 7
A 1 5
'''
print("axis='columns'")
# 指定重设的是行索引还是列索引,默认是行索引
df3 = df.reindex(['Col-2', 'c3', 'Col-1'], axis='columns')
print("df3:\n",df3)
# 同时调整行和列
df4 = df.reindex(index=['C', 'B', 'A'], columns=['Col-2', 'c3', 'Col-1'])
print("df4:\n",df4)
'''
输出结果:
axis='columns'
df3:
Col-2 c3 Col-1
A 5 NaN 1
B 7 NaN 3
C 9 NaN 5
df4:
Col-2 c3 Col-1
C 9.0 NaN 5.0
B 7.0 NaN 3.0
A 5.0 NaN 1.0
'''
用另一个DataFrame的索引来更新当前DataFrame的索引-reindex_like()
如果是原数据中不存在的索引值,则默认填充空值NaN,也可以使用method参数设置向前填充还是向后填充。
注意:reindex_like()中没有fill_value参数,不支持用指定值填充。
import pd as pandas
dfa = pd.DataFrame({'Col-1': [1, 3, 5], 'Col-2': [5, 7, 9]}, index=['A', 'B', 'C'])
print("dfa:\n",dfa)
dfb = pd.DataFrame({'Col-1': [1, 3, 5, 7, 9], 'Col-2': [2, 4, 6, 8, 10]},
index=['A', 'B', 'C', 'D', 'E'])
print("dfb:\n" ,dfb, '\n', end='*'*30+'\n')
dfc = dfa.reindex_like(dfb)
print("dfc:\n",dfc)
'''
输出结果:
dfa:
Col-1 Col-2
A 1 5
B 3 7
C 5 9
dfb:
Col-1 Col-2
A 1 2
B 3 4
C 5 6
D 7 8
E 9 10
******************************
dfc:
Col-1 Col-2
A 1.0 5.0
B 3.0 7.0
C 5.0 9.0
D NaN NaN
E NaN NaN
'''
2 文件访问
2.1 csv文件
Pandas 可以很方便的处理 CSV 文件,常用方法有:
方法名称 | 功能描述 | 常用参数 |
---|---|---|
pd.read_csv() | 从 CSV 文件读取数据并加载为 DataFrame | filepath_or_buffer (路径或文件对象),sep (分隔符),header (行标题),names (自定义列名),dtype (数据类型),index_col (索引列) |
DataFrame.to_csv() | 将 DataFrame 写入到 CSV 文件 | path_or_buffer (目标路径或文件对象),sep (分隔符),index (是否写入索引),columns (指定列),header (是否写入列名),mode (写入模式) |
pd.read_csv() - 读取 CSV 文件
read_csv() 是从 CSV 文件中读取数据的主要方法,将数据加载为一个 DataFrame。
import pandas as pd
# 读取 CSV 文件,并自定义列名和分隔符
df = pd.read_csv('data.csv', sep=';', header=0, names=['A', 'B', 'C'], dtype={'A': int, 'B': float})
print(df)
read_csv 常用参数:
参数 | 说明 | 默认值 |
---|---|---|
filepath_or_buffer | CSV 文件的路径或文件对象(支持 URL、文件路径、文件对象等) | 必需参数 |
sep | 定义字段分隔符,默认是逗号(, ),可以改为其他字符,如制表符(\t ) | ',' |
header | 指定行号作为列标题,默认为 0(表示第一行),或者设置为 None 没有标题 | 0 |
names | 自定义列名,传入列名列表 | None |
index_col | 用作行索引的列的列号或列名 | None |
usecols | 读取指定的列,可以是列的名称或列的索引 | None |
dtype | 强制将列转换为指定的数据类型 | None |
skiprows | 跳过文件开头的指定行数,或者传入一个行号的列表 | None |
nrows | 读取前 N 行数据 | None |
na_values | 指定哪些值应视为缺失值(NaN) | None |
skipfooter | 跳过文件结尾的指定行数 | 0 |
encoding | 文件的编码格式(如 utf-8 ,latin1 等) | None |
df.to_csv() - 将 DataFrame 写入 CSV 文件
to_csv() 是将 DataFrame 写入 CSV 文件的方法,支持自定义分隔符、列名、是否包含索引等设置。
import pandas as pd
# 假设 df 是一个已有的 DataFrame
df.to_csv('output.csv', index=False, header=True, columns=['A', 'B'])
to_csv 常用参数:
参数 | 说明 | 默认值 |
---|---|---|
path_or_buffer | CSV 文件的路径或文件对象(支持文件路径、文件对象) | 必需参数 |
sep | 定义字段分隔符,默认是逗号(, ),可以改为其他字符,如制表符(\t ) | ',' |
index | 是否写入行索引,默认 True 表示写入索引 | True |
columns | 指定写入的列,可以是列的名称列表 | None |
header | 是否写入列名,默认 True 表示写入列名,设置为 False 表示不写列名 | True |
mode | 写入文件的模式,默认是 w (写模式),可以设置为 a (追加模式) | 'w' |
encoding | 文件的编码格式,如 utf-8 ,latin1 等 | None |
line_terminator | 定义行结束符,默认为 \n | None |
quoting | 设置如何对文件中的数据进行引号处理(0-3,具体引用方式可查文档) | None |
quotechar | 设置用于引用的字符,默认为双引号 " | '"' |
date_format | 自定义日期格式,如果列包含日期数据,则可以使用此参数指定日期格式 | None |
doublequote | 如果为 True ,则在写入时会将包含引号的文本使用双引号括起来 | True |
2.2 Excel 文件
Pandas 提供了丰富的 Excel 文件操作功能,帮助我们方便地读取和写入 .xls
和 .xlsx
文件,支持多表单、索引、列选择等复杂操作,是数据分析中必备的工具。
操作 | 方法 | 说明 |
---|---|---|
读取 Excel 文件 | pd.read_excel() | 读取 Excel 文件,返回 DataFrame |
将 DataFrame 写入 Excel | DataFrame.to_excel() | 将 DataFrame 写入 Excel 文件 |
加载 Excel 文件 | pd.ExcelFile() | 加载 Excel 文件并访问多个表单 |
使用 ExcelWriter 写多个表单 | pd.ExcelWriter() | 写入多个 DataFrame 到同一 Excel 文件的不同表单 |
pd.read_excel() - 读取 Excel 文件
pd.read_excel()
方法用于从 Excel 文件中读取数据并加载为 DataFrame。它支持读取 .xls
和 .xlsx
格式的文件。
语法格式如下:
pandas.read_excel(io, sheet_name=0, *, header=0, names=None, index_col=None,
usecols=None, dtype=None, engine=None, converters=None,
true_values=None, false_values=None, skiprows=None, nrows=None,
na_values=None, keep_default_na=True, na_filter=True, verbose=False,
parse_dates=False, date_parser=<no_default>, date_format=None,
thousands=None, decimal='.', comment=None, skipfooter=0,
storage_options=None, dtype_backend=<no_default>, engine_kwargs=None)
参数说明:
-
io
:这是必需的参数,指定了要读取的 Excel 文件的路径或文件对象。 -
sheet_name=0
:指定要读取的工作表名称或索引。默认为0,即第一个工作表。 -
header=0
:指定用作列名的行。默认为0,即第一行。 -
names=None
:用于指定列名的列表。如果提供,将覆盖文件中的列名。 -
index_col=None
:指定用作行索引的列。可以是列的名称或数字。 -
usecols=None
:指定要读取的列。可以是列名的列表或列索引的列表。 -
dtype=None
:指定列的数据类型。可以是字典格式,键为列名,值为数据类型。 -
engine=None
:指定解析引擎。默认为None
,pandas 会自动选择。 -
converters=None
:用于转换数据的函数字典。 -
true_values=None
:指定应该被视为布尔值True
的值。 -
false_values=None
:指定应该被视为布尔值False
的值。 -
skiprows=None
:指定要跳过的行数或要跳过的行的列表。 -
nrows=None
:指定要读取的行数。 -
na_values=None
:指定应该被视为缺失值的值。 -
keep_default_na=True
:指定是否要将默认的缺失值(例如NaN
)解析为NA
。 -
na_filter=True
:指定是否要将数据转换为NA
。 -
verbose=False
:指定是否要输出详细的进度信息。 -
parse_dates=False
:指定是否要解析日期。 -
date_parser=<no_default>
:用于解析日期的函数。 -
date_format=None
:指定日期的格式。 -
thousands=None
:指定千位分隔符。 -
decimal='.'
:指定小数点字符。 -
comment=None
:指定注释字符。 -
skipfooter=0
:指定要跳过的文件末尾的行数。 -
storage_options=None
:用于云存储的参数字典。 -
dtype_backend=<no_default>
:指定数据类型后端。 -
engine_kwargs=None
:传递给引擎的额外参数字典。
DataFrame.to_excel() - 将 DataFrame 写入 Excel 文件
to_excel()
方法用于将 DataFrame 写入 Excel 文件,支持 .xls
和 .xlsx
格式。
语法格式如下:
DataFrame.to_excel(excel_writer, *, sheet_name='Sheet1', na_rep='', float_format=None,
columns=None, header=True, index=True, index_label=None, startrow=0,
startcol=0, engine=None, merge_cells=True, inf_rep='inf',
freeze_panes=None, storage_options=None, engine_kwargs=None)
参数说明:
-
excel_writer
:这是必需的参数,指定了要写入的 Excel 文件路径或文件对象。 -
sheet_name='Sheet1'
:指定写入的工作表名称,默认为'Sheet1'
。 -
na_rep=''
:指定在 Excel 文件中表示缺失值(NaN)的字符串,默认为空字符串。 -
float_format=None
:指定浮点数的格式。如果为None
,则使用 Excel 的默认格式。 -
columns=None
:指定要写入的列。如果为None
,则写入所有列。 -
header=True
:指定是否写入列名作为第一行。如果为False
,则不写入列名。 -
index=True
:指定是否写入索引作为第一列。如果为False
,则不写入索引。 -
index_label=None
:指定索引列的标签。如果为None
,则不写入索引标签。 -
startrow=0
:指定开始写入的行号,默认从第0行开始。 -
startcol=0
:指定开始写入的列号,默认从第0列开始。 -
engine=None
:指定写入 Excel 文件时使用的引擎,默认为None
,pandas 会自动选择。 -
merge_cells=True
:指定是否合并单元格。如果为True
,则合并具有相同值的单元格。 -
inf_rep='inf'
:指定在 Excel 文件中表示无穷大值的字符串,默认为'inf'
。 -
freeze_panes=None
:指定冻结窗格的位置。如果为None
,则不冻结窗格。 -
storage_options=None
:用于云存储的参数字典。 -
engine_kwargs=None
:传递给引擎的额外参数字典。
ExcelFile - 加载 Excel 文件
ExcelFile
是一个用于读取 Excel 文件的类,它可以处理多个表单,并在不重新打开文件的情况下访问其中的数据。
语法格式如下:
excel_file = pd.ExcelFile('data.xlsx')
常用方法:
方法 | 功能描述 |
---|---|
| 返回文件中所有表单的名称列表 |
| 解析指定表单并返回一个 DataFrame |
| 关闭文件,以释放资源 |
ExcelWriter - 写入 Excel 文件
ExcelWriter 是 pandas 提供的一个类,用于将 DataFrame 或 Series 对象写入 Excel 文件。使用 ExcelWriter,你可以在一个 Excel 文件中写入多个工作表,并且可以更灵活地控制写入过程。
语法格式如下:
pandas.ExcelWriter(path, engine=None, date_format=None, datetime_format=None, mode='w',
storage_options=None, if_sheet_exists=None, engine_kwargs=None)
参数说明:
-
path
:这是必需的参数,指定了要写入的 Excel 文件的路径、URL 或文件对象。可以是本地文件路径、远程存储路径(如 S3)、URL 链接或已打开的文件对象。 -
engine
:这是一个可选参数,用于指定写入 Excel 文件的引擎。如果为None
,则 pandas 会自动选择一个可用的引擎(默认优先选择openpyxl
,如果不可用则选择其他可用引擎)。常见的引擎包括'openpyxl'
(用于.xlsx
文件)、'xlsxwriter'
(提供高级格式化和图表功能)、'odf'
(用于 OpenDocument 格式如.ods
)等。 -
date_format
:这是一个可选参数,指定写入 Excel 文件中日期的格式字符串,例如"YYYY-MM-DD"
。 -
datetime_format
:这是一个可选参数,指定写入 Excel 文件中日期时间对象的格式字符串,例如"YYYY-MM-DD HH:MM:SS"
。 -
mode
:这是一个可选参数,默认为'w'
,表示写入模式。如果设置为'a'
,则表示追加模式,向现有文件中添加数据(仅支持部分引擎,如openpyxl
)。 -
storage_options
:这是一个可选参数,用于指定与存储后端连接的额外选项,例如认证信息、访问权限等,适用于写入远程存储(如 S3、GCS)。 -
if_sheet_exists
:这是一个可选参数,默认为'error'
,指定如果工作表已经存在时的行为。选项包括'error'
(抛出错误)、'new'
(创建一个新工作表)、'replace'
(替换现有工作表的内容)、'overlay'
(在现有工作表上覆盖写入)。 -
engine_kwargs
:这是一个可选参数,用于传递给引擎的其他关键字参数。这些参数会传递给相应引擎的函数,例如xlsxwriter.Workbook(file, **engine_kwargs)
或openpyxl.Workbook(**engine_kwargs)
等。