Pandas在各类数据处理场景中的常用代码
一、引言
Pandas是Python中强大的数据处理和分析库,提供了高效、灵活的数据结构和数据分析工具,广泛应用于数据清洗、转换、分析和可视化等数据处理流程中。本文将详细介绍Pandas在各类数据处理场景中的常用代码,帮助读者快速上手并熟练运用Pandas进行数据处理任务。
二、数据读取与写入
(一)读取常见格式数据
读取CSV文件
- 使用
read_csv
函数读取CSV文件,可指定文件路径、分隔符、编码等参数。
1
2
3
4
5
6
7import pandas as pd
# 读取CSV文件,默认逗号为分隔符
df = pd.read_csv('data.csv')
# 读取CSV文件,指定分号为分隔符,编码为UTF-8
df = pd.read_csv('data.csv', sep=';', encoding='utf-8')- 使用
读取Excel文件
- 使用
read_excel
函数读取Excel文件,可指定工作表名称或索引。
1
2
3
4
5
6
7
8# 读取Excel文件的默认工作表
df = pd.read_excel('data.xlsx')
# 读取Excel文件的指定工作表(通过名称)
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 读取Excel文件的指定工作表(通过索引,0表示第一个工作表)
df = pd.read_excel('data.xlsx', sheet_name=0)- 使用
读取SQL数据库数据(需安装相应数据库驱动)
- 以MySQL为例,使用
sqlalchemy
库创建数据库引擎,再用read_sql
函数读取数据。
1
2
3
4
5
6
7
8from sqlalchemy import create_engine
import pandas as pd
# 创建数据库引擎(假设MySQL数据库,根据实际情况修改参数)
engine = create_engine('mysql+pymysql://user:password@localhost:3306/database')
# 读取数据库表数据
df = pd.read_sql('SELECT * FROM table_name', engine)- 以MySQL为例,使用
(二)写入数据
写入CSV文件
- 使用
to_csv
函数将数据写入CSV文件,可指定文件路径、是否包含索引、编码等参数。
1
2
3
4
5# 将数据写入CSV文件,包含索引
df.to_csv('output.csv', index=True)
# 将数据写入CSV文件,不包含索引,指定编码为UTF-8
df.to_csv('output.csv', index=False, encoding='utf-8')- 使用
写入Excel文件
- 使用
to_excel
函数将数据写入Excel文件,可指定工作表名称等参数。
1
2
3
4
5# 将数据写入Excel文件的默认工作表
df.to_excel('output.xlsx')
# 将数据写入Excel文件的指定工作表(命名为'Sheet2')
df.to_excel('output.xlsx', sheet_name='Sheet2')- 使用
三、数据查看与基本信息获取
(一)查看数据
查看前几行数据
- 使用
head
方法查看数据框的前几行,默认显示前5行。
1
2
3
4df.head()
# 查看前10行数据
df.head(10)- 使用
查看后几行数据
- 使用
tail
方法查看数据框的后几行,默认显示后5行。
1
2
3
4df.tail()
# 查看后3行数据
df.tail(3)- 使用
随机查看数据
- 使用
sample
方法随机查看数据,可指定查看的行数。
1
2# 随机查看10行数据
df.sample(10)- 使用
(二)获取数据基本信息
查看数据形状(行数和列数)
1
df.shape
查看数据列名
1
df.columns
查看数据类型
- 使用
dtypes
方法查看每列的数据类型。
1
df.dtypes
- 使用
查看数据统计信息(数值型列)
- 使用
describe
方法获取数值型列的统计信息,包括计数、均值、标准差、最小值、最大值等。
1
df.describe()
- 使用
四、数据选择与过滤
(一)按列选择
选择单列数据
- 使用列名作为索引选择单列数据,返回一个Series对象。
1
column_data = df['column_name']
选择多列数据
- 使用列名列表选择多列数据,返回一个DataFrame对象。
1
columns_data = df[['column1', 'column2', 'column3']]
(二)按行选择
基于索引选择单行数据
- 使用
loc
方法基于索引标签选择单行数据,返回一个Series对象。
1
row_data = df.loc[index_label]
- 使用
基于索引选择多行数据
- 使用
loc
方法基于索引标签列表选择多行数据,返回一个DataFrame对象。
1
rows_data = df.loc[[index_label1, index_label2, index_label3]]
- 使用
基于位置选择单行数据
- 使用
iloc
方法基于整数位置选择单行数据,返回一个Series对象。
1
row_data = df.iloc[row_index]
- 使用
基于位置选择多行数据
- 使用
iloc
方法基于整数位置范围选择多行数据,返回一个DataFrame对象。
1
rows_data = df.iloc[start_row_index:end_row_index]
- 使用
(三)条件过滤
基于单个条件过滤数据
- 使用比较运算符(如
>
、<
、==
等)创建布尔条件,然后将条件应用于数据框进行过滤。
1
2# 选择某列大于特定值的行
filtered_data = df[df['column_name'] > value]- 使用比较运算符(如
基于多个条件过滤数据(使用逻辑运算符)
- 使用逻辑运算符(如
&
(与)、|
(或))组合多个条件进行过滤。
1
2# 选择某列大于特定值且另一列等于特定值的行
filtered_data = df[(df['column1'] > value1) & (df['column2'] == value2)]- 使用逻辑运算符(如
五、数据清洗与预处理
(一)处理缺失值
检查缺失值
- 使用
isnull
方法检查数据中的缺失值,返回一个布尔型数据框,True表示缺失值。
1
df.isnull()
- 使用
删除包含缺失值的行或列
- 使用
dropna
方法删除包含缺失值的行或列,可指定axis
参数(0表示行,1表示列)和how
参数(any
表示只要有缺失值就删除,all
表示全部为缺失值才删除)。
1
2
3
4
5# 删除包含缺失值的行
df.dropna(axis=0, how='any', inplace=True)
# 删除全为缺失值的列
df.dropna(axis=1, how='all', inplace=True)- 使用
填充缺失值
- 使用
fillna
方法填充缺失值,可指定填充的值或填充方法(如均值、中位数等)。
1
2
3
4
5# 用特定值填充缺失值
df.fillna(value, inplace=True)
# 用均值填充数值型列的缺失值
df.fillna(df.mean(), inplace=True)- 使用
(二)处理重复值
检查重复值
- 使用
duplicated
方法检查数据中的重复行,返回一个布尔型Series,True表示重复行。
1
df.duplicated()
- 使用
删除重复值
- 使用
drop_duplicates
方法删除重复行,可保留第一次出现或最后一次出现的行。
1
2
3
4
5# 删除重复行,保留第一次出现的行
df.drop_duplicates(keep='first', inplace=True)
# 删除重复行,保留最后一次出现的行
df.drop_duplicates(keep='last', inplace=True)- 使用
(三)数据类型转换
转换列的数据类型
- 使用
astype
方法将列的数据类型转换为指定类型,如将字符串类型转换为数值类型。
1
df['column_name'] = df['column_name'].astype(int)
- 使用
将日期字符串转换为日期类型
- 使用
to_datetime
方法将日期字符串列转换为日期类型,可指定日期格式。
1
df['date_column'] = pd.to_datetime(df['date_column'], format='%Y-%m-%d')
- 使用
(四)数据标准化与归一化
数据标准化(使数据具有零均值和单位方差)
- 使用
StandardScaler
类(需从sklearn.preprocessing
导入)对数值型列进行标准化。
1
2
3
4
5from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df[['column1', 'column2', 'column3']])
df[['column1', 'column2', 'column3']] = scaled_data- 使用
数据归一化(将数据映射到特定区间,如[0,1])
- 使用
MinMaxScaler
类(需从sklearn.preprocessing
导入)对数值型列进行归一化。
1
2
3
4
5from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(df[['column1', 'column2', 'column3']])
df[['column1', 'column2', 'column3']] = normalized_data- 使用
六、数据合并与连接
(一)合并数据框(基于键)
内连接(取两个数据框的交集)
- 使用
merge
函数进行内连接,指定连接键。
1
merged_df = pd.merge(df1, df2, on='key_column')
- 使用
左连接(以左边数据框为基础,保留所有行,右边数据框匹配不上的用缺失值填充)
1
merged_df = pd.merge(df1, df2, on='key_column', how='left')
右连接(以右边数据框为基础,保留所有行,左边数据框匹配不上的用缺失值填充)
1
merged_df = pd.merge(df1, df2, on='key_column', how='right')
外连接(取两个数据框的并集)
1
merged_df = pd.merge(df1, df2, on='key_column', how='outer')
(二)连接数据框(按轴拼接)
按行拼接(纵向拼接)
- 使用
concat
函数按行拼接数据框,可指定轴参数(0表示按行,1表示按列)。
1
concatenated_df = pd.concat([df1, df2], axis=0)
- 使用
按列拼接(横向拼接)
- 使用
concat
函数按列拼接数据框,需确保列数和列名匹配(或使用join='outer'
参数进行外连接)。
1
concatenated_df = pd.concat([df1, df2], axis=1)
- 使用
七、数据重塑与透视
(一)数据透视表
创建简单数据透视表
- 使用
pivot_table
函数创建数据透视表,指定索引、列和值。
1
pivot_table = df.pivot_table(index='category_column', columns='year_column', values='sales_column')
- 使用
添加聚合函数(如求和、平均值等)
- 在
pivot_table
函数中使用aggfunc
参数指定聚合函数。
1
pivot_table = df.pivot_table(index='category_column', columns='year_column', values='sales_column', aggfunc='sum')
- 在
(二)数据堆叠与展开
堆叠数据(将列转换为行)
- 使用
melt
函数将数据框从宽格式转换为长格式,指定id_vars
(保持不变的列)和value_vars
(要堆叠的列)。
1
melted_df = df.melt(id_vars=['id_column'], value_vars=['column1', 'column2', 'column3'])
- 使用
展开数据(将行转换为列)
- 使用
pivot
函数将长格式数据转换回宽格式,指定索引、列和值。
1
pivoted_df = melted_df.pivot(index='id_column', columns='variable', values='value')
- 使用
八、时间序列处理
(一)日期范围生成
生成指定频率的日期范围
- 使用
date_range
函数生成日期范围,可指定起始日期、结束日期、频率(如D
表示天,M
表示月,Y
表示年等)。
1
date_range = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
- 使用
(二)时间序列数据重采样
按时间频率重采样(如将日数据转换为月数据)
- 使用
resample
方法对时间序列数据进行重采样,指定重采样频率和聚合函数。
1
resampled_df = df.resample('M', on='date_column').sum()
- 使用
(三)时间序列数据移动窗口计算
计算移动平均值
- 使用
rolling
方法结合mean
函数计算移动平均值,可指定窗口大小。
1
moving_avg = df['column_name'].rolling(window=5).mean()
- 使用
九、数据分组与聚合
(一)分组操作
按单列分组
- 使用
groupby
方法按单列进行分组,返回一个分组对象。
1
grouped = df.groupby('category_column')
- 使用
按多列分组
- 使用
groupby
方法按多列进行分组。
1
grouped = df.groupby(['category_column1', 'category_column2'])
- 使用
(二)聚合操作
对分组后的数据进行聚合计算(如求和、平均值、计数等)
- 使用聚合函数(如
sum
、mean
、count
等)对分组后的数据进行计算,可对不同列应用不同聚合函数。
1
grouped_agg = grouped.agg({'column1': 'sum', 'column2': 'mean', 'column3': 'count'})
- 使用聚合函数(如
十、数据可视化(结合Matplotlib或Seaborn)
(一)简单绘图
绘制折线图
- 使用
plot
方法绘制折线图,可指定x轴和y轴列。
1
df.plot(x='x_column', y='y_column', kind='line')
- 使用
绘制柱状图
- 使用
plot
方法绘制柱状图,可指定柱状图类型(如bar
或barh
表示水平柱状图)。
1
df.plot(x='category_column', y='value_column', kind='bar')
- 使用
绘制散点图
- 使用
plot
方法绘制散点图。
1
df.plot(x='x_column', y='y_column', kind='scatter')
- 使用
(二)高级绘图(结合Seaborn)
绘制箱线图
- 使用
seaborn
库的boxplot
函数绘制箱线图,可指定x轴、y轴和数据集。
1
2
3import seaborn as sns
sns.boxplot(x='category_column', y='value_column', data=df)- 使用
绘制热力图
- 使用
seaborn
库的heatmap
函数绘制热力图,可指定数据矩阵和颜色映射。
1
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
- 使用
(三)保存绘图
保存绘制的图形为文件(如PNG、PDF等)
- 使用
savefig
方法保存图形,指定文件路径和格式。
1
plt.savefig('plot.png', format='png')
- 使用
十一、数据处理的综合应用示例
(一)数据清洗与分析流程
读取数据
- 从文件或数据库读取原始数据。
1
df = pd.read_csv('raw_data.csv')
查看数据信息
- 查看数据形状、列名、数据类型和统计信息。
1
2
3
4print(df.shape)
print(df.columns)
print(df.dtypes)
print(df.describe())数据清洗
处理缺失值
- 统计每列缺失值数量。
1
print(df.isnull().sum())
- 根据缺失值情况选择合适的处理方法,如删除包含缺失值的行或列,或使用特定值填充缺失值。
1
2
3
4# 删除包含缺失值的行
df.dropna(inplace=True)
# 或者使用均值填充某列缺失值(假设为数值列)
df['column_name'].fillna(df['column_name'].mean(), inplace=True)处理重复值
- 查找重复行。
1
print(df.duplicated().sum())
- 删除重复行,保留第一次出现的行。
1
df.drop_duplicates(keep='first', inplace=True)
处理异常值
- 根据数据的分布和业务逻辑,识别并处理异常值。例如,对于数值列,可以使用箱线图来确定异常值范围。
1
2
3
4
5
6
7
8import matplotlib.pyplot as plt
plt.boxplot(df['numeric_column'])
plt.show()
# 根据箱线图确定异常值范围后删除异常值(假设异常值定义为小于 Q1 - 1.5 * IQR 或大于 Q3 + 1.5 * IQR)
Q1 = df['numeric_column'].quantile(0.25)
Q3 = df['numeric_column'].quantile(0.75)
IQR = Q3 - Q1
df = df[(df['numeric_column'] >= Q1 - 1.5 * IQR) & (df['numeric_column'] <= Q3 + 1.5 * IQR)]
数据转换
数据类型转换
- 根据需要将列的数据类型进行转换。例如,将字符串类型的日期列转换为日期时间类型。
1
df['date_column'] = pd.to_datetime(df['date_column'])
特征工程
- 创建新特征。例如,根据日期列提取年、月、日等信息作为新列。
1
2
3df['year'] = df['date_column'].dt.year
df['month'] = df['date_column'].dt.month
df['day'] = df['date_column'].dt.day- 对数值列进行标准化或归一化处理(例如,使用 Min-Max 归一化将数据映射到 0 到 1 区间)。
1
2
3from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df[['numeric_column1', 'numeric_column2']] = scaler.fit_transform(df[['numeric_column1', 'numeric_column2']])
数据分析与探索
单变量分析
- 对数值列计算基本统计指标(均值、中位数、标准差、偏度、峰度等)。
1
2
3
4
5print(df['numeric_column'].mean())
print(df['numeric_column'].median())
print(df['numeric_column'].std())
print(df['numeric_column'].skew())
print(df['numeric_column'].kurtosis())- 绘制数值列的分布直方图。
1
2
3
4plt.hist(df['numeric_column'], bins=10)
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.show()- 对分类列计算类别分布。
1
print(df['category_column'].value_counts())
双变量分析
- 计算数值列之间的相关性矩阵。
1
print(df[['numeric_column1', 'numeric_column2', 'numeric_column3']].corr())
- 绘制数值列之间的散点图。
1
2
3
4plt.scatter(df['numeric_column1'], df['numeric_column2'])
plt.xlabel('Numeric Column 1')
plt.ylabel('Numeric Column 2')
plt.show()- 分析分类列与数值列之间的关系(例如,按分类列分组计算数值列的均值)。
1
2grouped = df.groupby('category_column')['numeric_column'].mean()
print(grouped)多变量分析(例如,使用数据透视表分析多个变量之间的关系)
1
2pivot_table = df.pivot_table(index='category_column1', columns='category_column2', values='numeric_column', aggfunc='mean')
print(pivot_table)
数据可视化
- 根据数据分析结果选择合适的可视化方式展示数据。
- 绘制折线图展示时间序列数据的趋势。
1
2
3
4plt.plot(df['date_column'], df['numeric_column'])
plt.xlabel('Date')
plt.ylabel('Value')
plt.show()- 绘制柱状图比较不同类别之间的数据差异。
1
2
3
4
5plt.bar(df['category_column'], df['numeric_column'])
plt.xlabel('Category')
plt.ylabel('Value')
plt.xticks(rotation=45)
plt.show()- 绘制箱线图展示数值列的分布情况及异常值。
1
2
3plt.boxplot(df['numeric_column'])
plt.ylabel('Value')
plt.show()- 绘制饼图展示分类列的类别占比。
1
2
3plt.pie(df['category_column'].value_counts(), labels=df['category_column'].value_counts().index, autopct='%1.1f%%')
plt.axis('equal')
plt.show()模型构建与评估(如果适用)
- 根据分析目的选择合适的机器学习模型(如回归模型、分类模型等)。
- 划分训练集和测试集。
1
2
3
4from sklearn.model_selection import train_test_split
X = df.drop('target_column', axis=1)
y = df['target_column']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)- 训练模型(以线性回归为例)。
1
2
3from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X_train, y_train)- 在测试集上进行预测。
1
y_pred = model.predict(X_test)
- 评估模型性能(例如,使用均方误差、准确率等指标)。
1
2
3
4
5
6from sklearn.metrics import mean_squared_error, accuracy_score
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse}")
# 如果是分类问题,计算准确率
# accuracy = accuracy_score(y_test, y_pred)
# print(f"Accuracy: {accuracy}")
使用Pandas进行数据分析的实际案例
案例一:销售数据分析
1. 背景介绍
某公司销售部门希望通过分析销售数据,了解销售趋势、产品销售情况以及客户购买行为,以便制定更有效的营销策略和库存管理策略。
2. 数据准备
- 数据来源:包含销售订单信息的CSV文件,字段包括订单日期、产品ID、产品名称、销售数量、销售单价、客户ID、客户名称等。
- 读取数据:
1 |
|
3. 数据分析步骤
数据清洗
- 检查缺失值:
1 |
|
- 处理缺失值(例如,删除包含缺失值的行或根据业务逻辑填充缺失值):
1 |
|
- 检查重复值:
1 |
|
- 删除重复值:
1 |
|
数据转换
- 将订单日期列转换为日期类型:
1 |
|
- 计算销售总额列:
1 |
|
数据分析与探索
- 按产品分析销售情况
- 计算每个产品的销售总额:
1 |
|
- 绘制产品销售总额的柱状图(使用Matplotlib或Seaborn):
1 |
|
- 按时间分析销售趋势
- 按月份汇总销售总额:
1 |
|
- 绘制销售趋势折线图:
1 |
|
- 分析客户购买行为
- 计算每个客户的购买次数和总消费金额:
1 |
|
- 找出消费金额最高的前10名客户:
1 |
|
案例二:学生成绩数据分析
1. 背景介绍
学校教务部门想要分析学生的考试成绩,评估教学质量,发现学生学习中的问题,并为教学改进提供依据。
2. 数据准备
- 数据来源:包含学生成绩信息的Excel文件,包括学生ID、姓名、科目、成绩等字段。
- 读取数据:
1 |
|
3. 数据分析步骤
数据清洗
- 检查数据类型是否正确,如有错误进行转换。例如,成绩列可能被错误识别为字符串类型,需要转换为数值类型:
1 |
|
- 处理异常值(例如,成绩超出合理范围的值):
1 |
|
数据分析与探索
- 整体成绩分布分析
- 绘制成绩分布直方图:
1 |
|
- 计算成绩的统计指标(均值、中位数、标准差等):
1 |
|
- 按科目分析成绩
- 计算每个科目的平均成绩、最高分和最低分:
1 |
|
- 比较不同科目成绩的差异(例如,使用箱线图):
1 |
|
- 学生个体成绩分析
- 计算每个学生的平均成绩:
1 |
|
- 找出成绩波动较大的学生(例如,通过计算成绩的标准差):
1 |
|
案例三:股票价格数据分析
1. 背景介绍
投资者希望通过分析股票价格数据,了解股票价格走势、波动情况以及不同股票之间的相关性,为投资决策提供参考。
2. 数据准备
- 数据来源:从金融数据平台获取股票价格的CSV文件,包含日期、股票代码、开盘价、最高价、最低价、收盘价、成交量等字段。
- 读取数据:
1 |
|
3. 数据分析步骤
数据清洗
- 处理缺失值(例如,某些日期可能没有交易数据,根据业务需求选择合适的处理方法,如向前填充或向后填充):
1 |
|
- 检查数据的一致性(例如,确保股票代码的唯一性和正确性):
1 |
|
数据分析与探索
- 股票价格走势分析
- 绘制单个股票价格随时间变化的折线图(以某只股票为例):
1 |
|
- 计算股票价格的移动平均线(例如,5日移动平均线和20日移动平均线),并绘制在同一图表中:
1 |
|
- 股票价格波动分析
- 计算股票价格的日收益率(使用对数收益率公式):
1 |
|
- 分析日收益率的分布(例如,绘制直方图和计算统计指标):
1 |
|
- 股票相关性分析
- 选择几只感兴趣的股票,计算它们收盘价之间的相关性矩阵:
1 |
|
- 使用热力图可视化相关性矩阵:
1 |
|