从0到1学Pandas(一):Pandas 基础入门
目录
- 一、Pandas 库概述
- 1.1 什么是 Pandas
- 1.2 Pandas 的特点
- 1.3 Pandas 的应用场景
- 二、环境配置与安装
- 2.1 安装 Python
- 2.2 安装 Pandas
- 2.3 验证安装
- 三、基本数据结构
- 3.1 Series(一维数据)
- 3.2 DataFrame(二维数据)
- 3.3 数据结构间转换
- 四、数据读取与导出
- 4.1 读取数据
- 4.2 导出数据
- 4.3 数据导入导出注意事项
一、Pandas 库概述
1.1 什么是 Pandas
Pandas 是 Python 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据 。它于 2008 年由 Wes McKinney 开发,名字来源于 “Panel Data”(面板数据)和 “Python Data Analysis”。Pandas 擅长处理表格型数据,比如常见的 Excel、CSV 文件等,是数据清洗、探索性分析的必备工具。在 Python 数据分析领域,Pandas 占据着核心地位,与 NumPy、Matplotlib 等库共同构成了强大的数据分析生态系统。
1.2 Pandas 的特点
- 高性能:Pandas 底层基于 NumPy 构建,使用了高效的算法和数据结构,在处理大规模数据时,无论是数据的读取还是数据的操作,速度都非常快,能大大提高数据处理的效率。
- 灵活的数据结构:提供了两种主要的数据结构,即 Series(一维数据)与 DataFrame(二维数据)。Series 可以看作是带有标签的一维数组,而 DataFrame 则类似 Excel 表格、SQL 数据表,由多个 Series 组成,每列可以是不同的数据类型,它们足以处理金融、统计、社会科学、工程等领域里的大多数典型数据用例,并且可以进行灵活的索引和切片操作,方便数据的处理和分析。
- 丰富的数据操作方法:Pandas 提供了一系列功能强大的方法用于数据操作,涵盖数据清洗(如处理缺失值、重复值、异常值等)、数据筛选、数据合并(merge)与连接(concat)、数据分组(groupby)与聚合、数据重塑(pivot)等,能够满足各种复杂的数据处理需求。
- 处理缺失值:可以轻松处理浮点和非浮点数据中的缺失数据,通常将缺失值表示为 NaN ,并提供了多种处理缺失值的方法,如删除缺失值(dropna)、填充缺失值(fillna)等。
- 数据对齐:在进行数据运算和操作时,Pandas 会自动根据索引进行数据对齐,确保数据的准确性和一致性,这一特性在处理来自不同数据源或者部分缺失数据时非常实用。
- 支持多种数据格式:支持从 CSV、Excel、SQL 数据库、JSON 文件等多种常见格式的数据源中读取数据,也能将处理后的数据保存为这些格式,方便与其他系统或工具进行数据交互。
1.3 Pandas 的应用场景
- 金融分析:在金融领域,Pandas 被广泛用于处理股票数据、金融指标和宏观经济数据等。例如,通过 Pandas 可以读取股票的历史价格数据,计算收益率、波动率等指标,进行技术分析和基本面分析,还能进行风险评估和投资组合优化。比如分析股票价格走势时,利用 Pandas 处理从雅虎财经等平台获取的 CSV 格式股票数据,计算每日收益率,并绘制折线图展示价格变化趋势。
- 数据分析:在对各类数据进行探索性分析时,Pandas 发挥着重要作用。它可以帮助分析师快速读取、清理和预处理数据,进行数据的描述性统计分析,如计算均值、中位数、标准差等,发现数据中的潜在规律和趋势,为后续的深入分析和决策提供支持。例如分析电商销售数据,使用 Pandas 统计不同商品的销量、销售额,找出畅销品和滞销品。
- 数据挖掘:在数据挖掘过程中,数据预处理是关键步骤,Pandas 提供了丰富的函数和方法来完成这一任务,如数据清洗、特征工程等。通过处理原始数据,将其转化为适合模型训练的格式,提高数据挖掘的效率和准确性。比如从大量的用户行为数据中提取有用特征,为用户分类和推荐系统做准备。
- 机器学习数据预处理:机器学习模型的性能很大程度上依赖于数据的质量和格式,Pandas 用于对原始数据进行清洗、转换和特征提取,将数据整理成适合机器学习算法输入的形式。例如将文本数据进行向量化处理,对数值数据进行标准化或归一化,为模型训练提供高质量的数据。
二、环境配置与安装
在开始使用 Pandas 进行数据分析之前,需要先完成 Python 环境的搭建,并安装 Pandas 库。下面将详细介绍具体的安装步骤。
2.1 安装 Python
Python 是 Pandas 运行的基础,推荐安装 Python 3.x 版本,目前 Python 3.13 是较新的版本,具有更好的性能和更多新特性 。可以从 Python 官方网站(https://www.python.org/downloads/ )下载 Python 安装包。
以 Windows 系统为例,下载完成后,双击安装包开始安装。在安装界面中,务必勾选 “Add Python to PATH” 选项,这样系统会自动将 Python 添加到环境变量中,方便后续在命令行中直接使用 Python 和相关工具。如果忘记勾选该选项,安装完成后也可以手动配置环境变量。之后按照安装向导的提示,点击 “Install Now”(默认安装)或 “Customize installation”(自定义安装,可选择安装路径等)完成安装。
安装完成后,验证 Python 是否安装成功。同时按下 Win+R 键,输入 “cmd” 打开命令提示符,在命令提示符中输入 “python --version”,如果显示 Python 的版本号,如 “Python 3.13.5”,则说明 Python 安装成功。
2.2 安装 Pandas
安装好 Python 后,就可以安装 Pandas 库了,常见的安装方式有使用 pip 和 conda。
- pip 安装:pip 是 Python 的包管理工具,通常在安装 Python 时会一并安装。在命令提示符中输入以下命令即可安装最新版本的 Pandas:
pip install pandas
如果需要安装特定版本的 Pandas,比如安装 1.5.3 版本,可以使用以下命令:
pip install pandas==1.5.3
如果下载速度较慢,可以使用国内镜像源加速下载,例如使用清华大学的镜像源:
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
- conda 安装:conda 是一个跨平台的包管理和环境管理系统,通过安装 Anaconda 或 Miniconda 可以使用 conda。如果已经安装了 Anaconda 或 Miniconda,打开 Anaconda Prompt(在开始菜单中找到 Anaconda 文件夹,里面有 Anaconda Prompt 选项),可以创建一个新的虚拟环境来安装 Pandas(这一步是可选的,但推荐这样做,以避免不同项目之间的包版本冲突) ,例如创建一个名为 “myenv”,Python 版本为 3.8 的虚拟环境:
conda create -n myenv python=3.8
然后激活这个虚拟环境:
conda activate myenv
在激活的虚拟环境中,使用以下命令安装 Pandas:
conda install pandas
若要安装特定版本,比如 1.5.3 版本,命令如下:
conda install pandas=1.5.3
2.3 验证安装
安装完成后,通过编写 Python 代码来验证 Pandas 是否安装成功。打开 Python 交互式环境(在命令提示符中输入 “python” 即可进入),输入以下代码:
import pandas as pd
print(pd.__version__)
如果没有报错,并且输出了 Pandas 的版本号,如 “1.5.3”,则说明 Pandas 安装成功。这样就完成了 Python 环境和 Pandas 库的安装与验证,可以开始使用 Pandas 进行数据分析工作了。
三、基本数据结构
在 Pandas 中,Series 和 DataFrame 是两个重要的数据结构,分别用于处理一维和二维数据。理解它们的创建方式和操作方法,是进行数据分析的基础。
3.1 Series(一维数据)
Series 是一种一维带标签数组,由一组数据和对应的索引组成,索引可以看作是数据的标签,方便对数据进行定位和操作。
创建 Series 的方式:
- 从列表创建:通过将列表传递给pd.Series()函数即可创建。
import pandas as pd
data = [10, 20, 30, 40, 50]
s1 = pd.Series(data)
print(s1)
输出结果:
0 10
1 20
2 30
3 40
4 50
dtype: int64
这里,默认生成的索引是从 0 开始的整数序列。
- 从数组创建:首先需要导入numpy库来创建数组,再用数组创建 Series。
import numpy as np
import pandas as pd
arr = np.array([1.1, 2.2, 3.3, 4.4])
s2 = pd.Series(arr)
print(s2)
输出结果:
0 1.1
1 2.2
2 3.3
3 4.4
dtype: float64
同样,默认生成整数索引。
- 从字典创建:字典的键会自动成为 Series 的索引,值则作为数据。
import pandas as pd
data_dict = {'a': 100, 'b': 200, 'c': 300}
s3 = pd.Series(data_dict)
print(s3)
输出结果:
a 100
b 200
c 300
dtype: int64
索引设置和数据操作:
- 设置索引:在创建 Series 时可以自定义索引。
import pandas as pd
data = [5, 10, 15, 20]
index_labels = ['one', 'two', 'three', 'four']
s = pd.Series(data, index=index_labels)
print(s)
输出结果:
one 5
two 10
three 15
four 20
dtype: int64
- 数据选取:可以通过索引来选取数据。
import pandas as pd
data = [10, 20, 30, 40]
s = pd.Series(data, index=['a', 'b', 'c', 'd'])
# 选取单个数据
print(s['b'])
# 选取多个数据
print(s[['a', 'c']])
输出结果:
20
a 10
c 30
dtype: int64
还可以使用位置索引进行切片操作。
print(s[1:3])
输出结果:
b 20
c 30
dtype: int64
- 数据修改:通过索引可以修改对应位置的数据。
s['d'] = 50
print(s)
输出结果:
a 10
b 20
c 30
d 50
dtype: int64
3.2 DataFrame(二维数据)
DataFrame 是一个二维的表格型数据结构,由多个 Series 组成,每列都是一个 Series,且所有列共享同一索引。每列可以看作是一个 Series 对象,各列数据类型可以不同。
创建 DataFrame 的方法:
- 从字典创建:字典的键作为列名,值是对应列的数据,数据可以是列表、数组等。
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['Beijing', 'Shanghai', 'Guangzhou']
}
df1 = pd.DataFrame(data)
print(df1)
输出结果:
Name Age City
0 Alice 25 Beijing
1 Bob 30 Shanghai
2 Charlie 35 Guangzhou
- 从二维数组创建:需要先导入numpy库生成二维数组,同时指定列名和索引。
import numpy as np
import pandas as pd
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
columns = ['col1', 'col2', 'col3']
index = ['row1', 'row2', 'row3']
df2 = pd.DataFrame(arr, columns=columns, index=index)
print(df2)
输出结果:
col1 col2 col3
row1 1 2 3
row2 4 5 6
row3 7 8 9
- 从列表的列表创建:每个内部列表表示 DataFrame 的一行数据。
import pandas as pd
data_list = [['Tom', 22, 'Shenzhen'],['Jerry', 28, 'Chengdu'],['Spike', 31, 'Hangzhou']
]
columns = ['Name', 'Age', 'City']
df3 = pd.DataFrame(data_list, columns=columns)
print(df3)
输出结果:
Name Age City
0 Tom 22 Shenzhen
1 Jerry 28 Chengdu
2 Spike 31 Hangzhou
- 从 Series 字典创建:字典的键作为列名,值是 Series 对象。
import pandas as pd
s1 = pd.Series(['Apple', 'Banana', 'Orange'])
s2 = pd.Series([10, 20, 30])
data_dict_series = {'Fruit': s1,'Quantity': s2
}
df4 = pd.DataFrame(data_dict_series)
print(df4)
输出结果:
Fruit Quantity
0 Apple 10
1 Banana 20
2 Orange 30
行列操作:
- 选择列:通过列名可以选择单个列或多个列,选择单个列返回一个 Series,选择多个列返回一个 DataFrame。
# 选择单个列
age_series = df1['Age']
print(age_series)
# 选择多个列
name_city_df = df1[['Name', 'City']]
print(name_city_df)
输出结果:
0 25
1 30
2 35
Name: Age, dtype: int64Name City
0 Alice Beijing
1 Bob Shanghai
2 Charlie Guangzhou
- 选择行:可以通过索引标签(.loc)或整数位置(.iloc)来选择行。
# 通过索引标签选择行
row1 = df1.loc[0]
print(row1)
# 通过整数位置选择行
row2 = df1.iloc[1]
print(row2)
输出结果:
Name Alice
Age 25
City Beijing
Name: 0, dtype: object
Name Bob
Age 30
City Shanghai
Name: 1, dtype: object
- 添加列:直接给 DataFrame 赋值新的列名和数据即可添加新列。
df1['Salary'] = [5000, 8000, 10000]
print(df1)
输出结果:
Name Age City Salary
0 Alice 25 Beijing 5000
1 Bob 30 Shanghai 8000
2 Charlie 35 Guangzhou 10000
- 删除列:使用drop方法,指定列名和axis=1(表示按列操作)。
df1 = df1.drop('Salary', axis=1)
print(df1)
输出结果:
Name Age City
0 Alice 25 Beijing
1 Bob 30 Shanghai
2 Charlie 35 Guangzhou
- 添加行:可以使用concat函数将新的 DataFrame 或 Series 与原 DataFrame 进行连接。
new_row = pd.Series(['David', 27, 'Nanjing'], index=['Name', 'Age', 'City'])
df1 = pd.concat([df1, new_row.to_frame().T], ignore_index=True)
print(df1)
输出结果:
Name Age City
0 Alice 25 Beijing
1 Bob 30 Shanghai
2 Charlie 35 Guangzhou
3 David 27 Nanjing
- 删除行:使用drop方法,指定行索引和axis=0(表示按行操作)。
df1 = df1.drop(3, axis=0)
print(df1)
输出结果:
Name Age City
0 Alice 25 Beijing
1 Bob 30 Shanghai
2 Charlie 35 Guangzhou
3.3 数据结构间转换
- Series 转 DataFrame:通常是将 Series 作为 DataFrame 的一列来构建 DataFrame。
import pandas as pd
s = pd.Series([100, 200, 300], index=['a', 'b', 'c'])
# 方法一:使用to_frame
df = s.to_frame(name='Values')
print(df)
# 方法二:直接构建字典再创建DataFrame
df2 = pd.DataFrame({'Values': s})
print(df2)
输出结果:
Values
a 100
b 200
c 300Values
a 100
b 200
c 300
这种转换常用于将单个变量的数据扩展为表格形式,方便与其他数据进行合并或进一步分析。
- DataFrame 转 Series:通过选取 DataFrame 中的单列即可得到一个 Series。
data = {'Col1': [1, 2, 3],'Col2': [4, 5, 6]
}
df = pd.DataFrame(data)
s = df['Col1']
print(s)
输出结果:
0 1
1 2
2 3
Name: Col1, dtype: int64
当只需要处理 DataFrame 中的某一列数据时,将其转换为 Series 可以简化操作。
四、数据读取与导出
在实际数据分析工作中,经常需要读取各种格式的数据文件,进行处理后再将结果导出。Pandas 提供了丰富的函数和方法,方便地实现数据的读取与导出。
4.1 读取数据
- 读取 CSV 文件:使用pd.read_csv()函数读取 CSV(逗号分隔值)文件,这是最常用的数据读取方式之一。
import pandas as pd
# 读取简单的CSV文件
df_csv = pd.read_csv('data.csv')
print(df_csv)
read_csv函数有许多常用参数:
- sep:指定分隔符,默认是逗号’,‘。如果 CSV 文件使用其他分隔符,比如分号’;‘,则可以这样设置:df = pd.read_csv(‘data.csv’, sep=’;')。
- header:指定哪一行作为列名,默认为 0(即第一行作为列名)。如果文件没有列名,可设置为None,例如df = pd.read_csv(‘data.csv’, header=None) 。
- names:自定义列名,需要与header=None配合使用。如df = pd.read_csv(‘data.csv’, header=None, names=[‘col1’, ‘col2’, ‘col3’]) 。
- index_col:指定某列作为索引,既可以使用列名,也可以使用列的索引位置。例如df = pd.read_csv(‘data.csv’, index_col=‘ID’)或df = pd.read_csv(‘data.csv’, index_col=0) 。
- usecols:选择要读取的列,可以传入列名列表或列索引列表。如df = pd.read_csv(‘data.csv’, usecols=[‘col1’, ‘col2’])或df = pd.read_csv(‘data.csv’, usecols=[0, 2]) 。
- encoding:指定文件编码,处理包含中文字符的 CSV 文件时,常用的编码格式有’utf-8’、'gbk’等。若文件编码为gbk,则df = pd.read_csv(‘data.csv’, encoding=‘gbk’) 。
- nrows:指定读取的行数,用于从大文件中快速获取部分数据进行预览或测试。例如df = pd.read_csv(‘data.csv’, nrows=100),表示只读取前 100 行数据。
- chunksize:对于大文件,设置chunksize参数可以分块读取,减少内存占用。每块数据作为一个 DataFrame 返回,可以进行逐块处理。
for chunk in pd.read_csv('large_data.csv', chunksize=1000):# 对每个数据块进行处理,例如计算某列的均值mean_value = chunk['column_name'].mean()print(mean_value)
- 读取 Excel 文件:使用pd.read_excel()函数读取 Excel 文件,在读取前需要安装openpyxl(用于.xlsx格式文件)或xlrd(用于.xls格式文件)库。
# 读取Excel文件,默认读取第一个工作表
df_excel = pd.read_excel('data.xlsx')
print(df_excel)
read_excel函数的常用参数与read_csv部分相似,此外还有:
- sheet_name:指定读取的工作表,可以是工作表名称,也可以是工作表索引(从 0 开始)。如df = pd.read_excel(‘data.xlsx’, sheet_name=‘Sheet2’)或df = pd.read_excel(‘data.xlsx’, sheet_name=1) 。若要读取多个工作表,可将sheet_name设置为None,此时返回一个字典,键为工作表名称,值为对应的 DataFrame。
dfs = pd.read_excel('data.xlsx', sheet_name=None)
for sheet_name, df in dfs.items():print(f'Sheet: {sheet_name}')print(df)
- 读取 JSON 文件:使用pd.read_json()函数读取 JSON(JavaScript Object Notation)格式的数据,JSON 是一种轻量级的数据交换格式,常用于数据传输和存储。
# 从JSON文件读取数据
df_json = pd.read_json('data.json')
print(df_json)
read_json函数的orient参数用于指定 JSON 数据的结构方式,常见的值有’split’、‘records’、‘index’、‘columns’和’values’,默认值为’columns’ 。不同的orient值对应不同的 JSON 数据结构 。例如,当orient='records’时,JSON 数据以记录的形式组织,每个记录是一个字典,表示 DataFrame 的一行数据。
data = [{'Name': 'Alice', 'Age': 25, 'City': 'Beijing'},{'Name': 'Bob', 'Age': 30, 'City': 'Shanghai'}
]
import pandas as pd
df = pd.read_json(str(data), orient='records')
print(df)
4.2 导出数据
- 导出为 CSV 文件:使用DataFrame.to_csv()方法将 DataFrame 对象保存为 CSV 文件。
import pandas as pd
data = {'Name': ['Alice', 'Bob', 'Charlie'],'Age': [25, 30, 35],'City': ['Beijing', 'Shanghai', 'Guangzhou']
}
df = pd.DataFrame(data)
# 导出为CSV文件
df.to_csv('output.csv')
to_csv方法的常用参数:
- index:默认为True,表示将 DataFrame 的索引写入 CSV 文件。如果不需要写入索引,可设置为False,即df.to_csv(‘output.csv’, index=False) 。
- header:默认为True,表示将列名写入 CSV 文件。若不想写入列名,可设置为False;也可以传入一个列表,作为列名的别名,如df.to_csv(‘output.csv’, header=[‘新列名1’, ‘新列名2’, ‘新列名3’]) 。
- sep:指定输出文件的字段分隔符,默认是逗号’,‘。如果需要使用其他分隔符,比如制表符’\t’,可设置为df.to_csv(‘output.csv’, sep=‘\t’) ,生成的文件通常以.txt为扩展名,用于表示是制表符分隔的文本文件。
- encoding:指定输出文件的编码格式,Python 3 上默认为’UTF-8’。处理包含中文字符的数据时,如果目标平台不支持UTF - 8编码,可尝试其他编码,如’gbk’,即df.to_csv(‘output.csv’, encoding=‘gbk’) 。
- 导出为 Excel 文件:使用DataFrame.to_excel()方法将 DataFrame 保存为 Excel 文件,需要安装openpyxl库。
# 导出为Excel文件,不保存索引
df.to_excel('output.xlsx', index=False)
如果要将多个 DataFrame 写入同一个 Excel 文件的不同工作表,可以使用ExcelWriter对象 。
import pandas as pd
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})
with pd.ExcelWriter('multi_sheet.xlsx') as writer:df1.to_excel(writer, sheet_name='Sheet1', index=False)df2.to_excel(writer, sheet_name='Sheet2', index=False)
- 导出为 JSON 文件:使用DataFrame.to_json()方法将 DataFrame 转换为 JSON 格式的数据并保存为文件。
# 将DataFrame导出为JSON文件,orient='records'表示每行数据作为一个独立的JSON对象
df.to_json('output.json', orient='records', lines=True)
orient参数同样影响导出的 JSON 数据结构,lines=True表示每行数据作为一行写入文件,适用于orient='records’或orient='split’时 。还可以通过date_format参数指定日期格式(如果数据中包含日期列),如df.to_json(‘output.json’, date_format=‘iso’),这里使用’iso’格式表示国际标准的日期时间格式。
4.3 数据导入导出注意事项
- 文件路径:确保文件路径的正确性,使用相对路径时,要注意当前工作目录;使用绝对路径时,要保证路径的准确性和完整性。如果路径错误,会导致文件无法读取或保存失败 。建议在开发和测试过程中,使用绝对路径进行调试,确保无误后再根据实际情况选择合适的路径方式 。在 Windows 系统中,路径分隔符为\,但在 Python 字符串中,需要使用转义字符\,或者使用原始字符串r’路径’,例如r’C:\data\file.csv’。
- 编码问题:处理包含非 ASCII 字符(如中文)的数据时,务必注意编码设置。读取文件时,若编码设置错误,会出现乱码或读取失败的情况;导出文件时,若编码选择不当,在其他程序中打开文件也可能出现乱码 。优先尝试使用UTF - 8编码,因为它是一种广泛支持的通用编码格式 。如果UTF - 8编码无法满足需求,再尝试其他编码,如GBK(中文简体编码)、GB2312(简体中文编码,是 GBK 的子集)、GB18030(支持中国国内少数民族文字的编码)等 。在读取或导出文件时,可通过encoding参数明确指定编码格式。
- 数据类型匹配:在读取数据时,Pandas 会自动推断数据类型,但有时可能推断不准确,尤其是遇到混合数据类型或特殊格式的数据时 。例如,将数值列误判为对象(字符串)类型,这可能导致后续数据分析和计算出现错误 。可以通过dtype参数手动指定列的数据类型,确保数据类型的准确性 。在导出数据时,也要注意数据类型的兼容性,避免因数据类型转换问题导致数据丢失或错误 。比如,将日期时间类型的数据导出为 CSV 文件时,如果不进行适当的处理,可能会丢失日期时间的精度或格式被改变。在导出前,可以使用astype()方法将数据转换为合适的数据类型。