Pandas是Python生态系统中最强大、最流行的数据分析库,专为处理结构化数据(如表格和时间序列)而设计。它提供了高效的数据结构和丰富的功能,使得数据清洗、转换、分析和可视化变得简单直观。
一、Pandas库的安装详解
1. 安装前的准备
在安装Pandas之前,建议先确保已安装Python环境(建议Python 3.6及以上版本)。可以通过以下命令检查Python版本:
bash
python --version
或
bash
python3 --version
2. 安装方法
方法一:使用pip安装(推荐)
这是最简单直接的安装方式:
bash
pip install pandas
如果需要安装特定版本:
bash
pip install pandas==1.3.5#本篇所用版本
方法二:使用conda安装(适合Anaconda用户)
bash
conda install pandas
方法三:源码安装(适合开发者)
bash
git clone https://github.com/pandas-dev/pandas.git
cd pandas
python setup.py install
3. 验证安装
安装完成后,可以通过以下方式验证:
python
import pandas as pd
print(pd.__version__)
4. 常见问题解决
安装速度慢
可以更换国内的镜像源:
bash
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
二、pandas的数据结构
pandas 主要提供了两种核心数据结构:
-
Series(一维数组)
-
类似于带标签的一维数组
-
由两个数组组成:一个存储数据,一个存储索引(默认从0开始)
-
示例:
pythonimport pandas as pd s = pd.Series([1, 3, 5, 7], index=['a', 'b', 'c', 'd'])
-
特性:
- 支持向量化操作
- 可以存储任意数据类型
- 索引可以重复
-
-
DataFrame(二维表格)
-
类似于电子表格或SQL表
-
由多个Series组成的字典结构
-
示例:
pythondata = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]} df = pd.DataFrame(data)
-
特性:
- 行索引(index)和列索引(columns)
- 支持列的不同数据类型
- 提供丰富的数据操作方法
-
这些数据结构为数据分析提供了强大的基础,支持从数据读取、清洗到分析的全流程操作。
三、pandas数据读取与写入
读取数据
pandas提供了多种方法来读取不同格式的数据文件:
1. 读取CSV文件
python
import pandas as pd
# 基本读取
df = pd.read_csv('data.csv')
# 带参数读取
df = pd.read_csv('data.csv',
encoding='utf-8',
header=0, # 指定表头行
index_col=0, # 指定索引列
na_values=['NA', 'N/A']) # 指定缺失值标识
2. 读取Excel文件
python
# 读取单个sheet
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 读取整个Excel文件的所有sheet
excel_file = pd.ExcelFile('data.xlsx')
df1 = excel_file.parse('Sheet1')
df2 = excel_file.parse('Sheet2')
3. 读取JSON文件
python
df = pd.read_json('data.json', orient='records')
4. 读取SQL数据库
python
from sqlalchemy import create_engine
# 创建数据库连接
engine = create_engine('sqlite:///database.db')
# 读取数据
df = pd.read_sql('SELECT * FROM table_name', con=engine)
写入数据
pandas同样支持多种数据格式的输出:
1. 写入CSV文件
python
df.to_csv('output.csv',
index=False, # 不写入索引
encoding='utf-8',
columns=['col1', 'col2']) # 指定写入的列
2. 写入Excel文件
python
# 写入单个sheet
df.to_excel('output.xlsx', sheet_name='Data')
# 写入多个sheet
with pd.ExcelWriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='Sheet1')
df2.to_excel(writer, sheet_name='Sheet2')
3. 写入JSON文件
python
df.to_json('output.json', orient='records')
4. 写入SQL数据库
python
# 写入新表
df.to_sql('new_table', con=engine, if_exists='fail')
# 追加到现有表
df.to_sql('existing_table', con=engine, if_exists='append')
其他实用功能
1. 处理大文件
对于大文件可以使用分块读取:
python
chunk_size = 10000
chunks = pd.read_csv('large_file.csv', chunksize=chunk_size)
for chunk in chunks:
# 处理每个数据块
process(chunk)
2. 数据类型指定
python
dtypes = {'col1': 'int32', 'col2': 'category'}
df = pd.read_csv('data.csv', dtype=dtypes)
3. 日期解析
python
df = pd.read_csv('data.csv', parse_dates=['date_column'])
四、pandas数据查看与检查
head()和tail()方法
-
df.head(n)
:查看DataFrame的前n行,默认显示前5行pythondf.head(10) # 查看前10行数据
-
df.tail(n)
:查看DataFrame的后n行,默认显示后5行pythondf.tail(3) # 查看最后3行数据
数据概览
-
df.shape
:查看DataFrame的形状(行数,列数)pythonprint(df.shape) # 输出类似(1000, 15)表示1000行15列
-
df.info()
:查看数据集的整体信息- 显示每列的非空值数量
- 每列的数据类型
- 内存使用情况
pythondf.info() # 输出各列详细信息
数据统计信息检查
describe()方法
-
df.describe()
:生成描述性统计信息- 数值型列:计数、均值、标准差、最小值、四分位数、最大值
- 非数值型列:计数、唯一值数量、频数最高的值及其出现次数
pythondf.describe(include='all') # 包含所有列 df.describe(include=['float64']) # 只包含浮点数列
唯一值和频率统计
-
df.nunique()
:查看每列的唯一值数量pythondf.nunique() # 各列唯一值数量
-
df.value_counts()
:查看某列的值分布pythondf['gender'].value_counts(normalize=True) # 显示比例而非计数
数据类型和缺失值检查
数据类型检查
-
df.dtypes
:查看各列的数据类型pythonprint(df.dtypes) # 输出各列数据类型
-
类型转换示例:
pythondf['date'] = pd.to_datetime(df['date']) # 转换为日期类型 df['price'] = df['price'].astype(float) # 转换为浮点数
缺失值检查
-
df.isnull()
:返回布尔矩阵,显示每个元素是否为缺失值pythondf.isnull().sum() # 统计每列缺失值数量
-
缺失值可视化:
pythonimport matplotlib.pyplot as plt import seaborn as sns sns.heatmap(df.isnull(), cbar=False) plt.show()
更高级的数据检查方法
数据抽样
-
df.sample()
:随机抽样查看数据pythondf.sample(5) # 随机查看5行 df.sample(frac=0.1) # 抽取10%的数据
条件筛选检查
-
使用布尔索引筛选特定数据
python# 查看年龄大于30的记录 df[df['age'] > 30] # 查看特定城市和性别的记录 df[(df['city'] == 'Beijing') & (df['gender'] == 'Female')]
重复值检查
-
df.duplicated()
:检查重复行pythondf.duplicated().sum() # 统计重复行数 df[df.duplicated()] # 查看重复行
-
特定列重复检查:
pythondf.duplicated(subset=['id', 'date']).sum() # 检查ID和日期组合是否重复
五、pandas数据选择与过滤
1. 列选择
列选择是最基础的数据操作之一,通过列名来获取指定列的数据。
markdown
### 单列选择
```python
df['Name'] # 返回Name列的所有数据,返回类型为Series
多列选择
python
df[['Name', 'Age']] # 返回包含Name和Age两列的数据,返回类型为DataFrame
应用场景:当只需要分析特定几列数据时使用,例如只需要查看客户的姓名和年龄信息。
2. 行选择
行选择可以通过标签或位置索引来获取数据。
按标签选择行(loc)
python
df.loc[0] # 返回索引标签为0的行数据
df.loc[0:2] # 返回索引标签从0到2的行数据(包含2)
按位置选择行(iloc)
python
df.iloc[0] # 返回第一行数据(位置索引从0开始)
df.iloc[0:3] # 返回第1到第3行数据(不包含3)
注意事项:
- loc是基于标签的索引,包含结束位置
- iloc是基于位置的索引,不包含结束位置
3. 条件过滤
条件过滤可以根据特定条件筛选出符合要求的数据行。
简单条件过滤
python
df[df['Age'] > 30] # 筛选出年龄大于30岁的所有记录
多条件组合过滤
python
df[(df['Age'] > 25) & (df['City'] == 'NY')] # 筛选年龄大于25岁且居住在NY的记录
示例说明:假设我们有一个客户数据集,包含Name、Age、City等字段。使用多条件过滤可以快速找到特定城市的特定年龄段客户。
运算符说明:
- & 表示逻辑与
- | 表示逻辑或
- ~ 表示逻辑非
注意:多个条件必须用括号括起来,否则会报错。
六、数据处理
1. 缺失值处理
缺失值是数据分析中常见的问题,pandas提供了多种处理方式:
删除缺失值
python
df.dropna() # 默认删除包含任何缺失值的整行
df.dropna(axis=1) # 删除包含缺失值的列
df.dropna(thresh=3) # 只保留至少有3个非缺失值的行
填充缺失值
python
df.fillna(0) # 用0填充所有缺失值
df.fillna({'Salary': df['Salary'].mean(), 'Age': 30}) # 对不同列使用不同填充值
df.fillna(method='ffill') # 用前一个有效值向前填充
缺失值检测
python
df.isnull() # 返回布尔DataFrame,显示每个位置是否为缺失值
df.isnull().sum() # 计算每列的缺失值数量
df[df['Age'].isnull()] # 筛选出Age列为缺失值的行
2. 重复值处理
重复数据会影响分析结果,常见的处理方法包括:
python
df.drop_duplicates() # 删除完全相同的行
df.drop_duplicates(subset=['Name', 'Phone']) # 基于指定列判断重复
df.drop_duplicates(keep='last') # 保留最后一次出现的重复行
df.drop_duplicates(keep=False) # 删除所有重复行
3. 数据排序
数据排序有助于发现模式和异常值:
python
df.sort_values('Age') # 按年龄升序排序
df.sort_values('Age', ascending=False) # 按年龄降序排序
df.sort_values(['Department', 'Salary'], ascending=[True, False]) # 多列排序
df.sort_index() # 按索引排序
4. 数据分组
分组是数据分析的核心操作,可用于计算各种统计量:
python
# 基本分组
df.groupby('City')['Age'].mean() # 按城市分组计算平均年龄
# 多重分组
df.groupby(['City', 'Gender'])['Income'].median() # 按城市和性别分组计算收入中位数
# 多聚合函数
df.groupby('Department').agg({
'Salary': ['mean', 'max', 'min'],
'Age': 'median'
})
# 分组后应用自定义函数
def top_earners(group):
return group.nlargest(3, 'Salary')
df.groupby('Department').apply(top_earners)
七、数据转换
1.添加新列 通过布尔条件创建新列是数据预处理中的常见操作:
python
df['Senior'] = df['Age'] > 30 # 添加布尔列,标记年龄大于30岁的员工
示例应用场景:在人力资源数据分析中,可以用此方法快速区分资深员工和普通员工,便于后续分组分析。
2.应用函数 使用apply方法可以对列数据进行函数处理:
python
df['Name_Length'] = df['Name'].apply(len) # 计算每个姓名的字符长度
df['Salary_Adjusted'] = df['Salary'].apply(lambda x: x*1.1) # 工资上调10%
最佳实践:当需要执行复杂转换时,可以定义单独的函数然后传入apply,提高代码可读性3
3.数据合并 Pandas提供多种数据合并方式: 纵向合并(堆叠):
python
pd.concat([df1, df2], axis=0) # 默认纵向合并,相同结构的两个表格上下拼接
pd.concat([df1, df2], ignore_index=True) # 重建索引
横向合并(连接):
python
# 内连接,基于共同键值合并
pd.merge(df1, df2, on='employee_id', how='inner')
# 左连接,保留左边表的所有记录
pd.merge(df1, df2, on='department', how='left')
# 外连接,保留所有记录
pd.merge(df1, df2, on='project_id', how='outer')
合并操作常用于:将分散在不同表中的相关数据整合到一起,比如将员工信息表与部门信息表合并。