
在 Python 的数据处理领域,Pandas 无疑是一款里程碑式的工具。它以简洁的语法和强大的功能,成为数据分析师、数据科学家手中不可或缺的 "瑞士军刀"。无论是数据清洗、转换,还是分析与建模,Pandas 都能提供高效的解决方案,极大地提升数据处理的效率。
一、Pandas 的核心数据结构
Pandas 的强大之处,首先体现在其精心设计的两种核心数据结构上,它们是整个库的基础。
1. Series:带标签的一维数组
Series 可以理解为一个带有索引的一维数组,它由数据值和对应的索引组成。这种结构使得数据的定位和操作更加灵活。
python
import pandas as pd
# 创建一个Series,指定索引和名称
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'], name='数值列')
# 查看索引
print(s.index) # 输出:Index(['a', 'b', 'c', 'd'], dtype='object')
# 查看数值
print(s.values) # 输出:[10 20 30 40]
# 通过索引获取值
print(s['b']) # 输出:20
2. DataFrame:二维表格型数据结构
DataFrame 是一个二维的表格型数据结构,类似于 Excel 表格或数据库中的表。它包含行索引和列索引,每一列可以是不同的数据类型。
kotlin
# 从字典创建DataFrame
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'部门': ['技术', '市场', '技术']
}
df = pd.DataFrame(data)
# 行索引默认为0、1、2;列索引为['姓名', '年龄', '部门']
二、数据的基本查看与操作
拿到一份数据后,首先需要对其有一个整体的了解,Pandas 提供了一系列方法来实现这一目的。
scss
# 查看前2行数据(默认显示5行)
print(df.head(2))
# 查看最后1行数据
print(df.tail(1))
# 查看数据的基本信息,包括列数据类型、非空值数量等
print(df.info())
# 对数值列进行统计分析,包括计数、均值、标准差、最值、四分位数等
print(df.describe())
# 查看数据的形状,返回(行数, 列数)的元组
print(df.shape)
三、数据的选择与筛选
在数据分析过程中,经常需要根据需求选择特定的数据,Pandas 提供了多种灵活的选择方式。
1. 按标签选择(loc)
通过行索引名和列名来定位数据。
lua
# 选择索引为1的单行所有列
print(df.loc[1])
# 选择索引为0和2的多行,以及'姓名'和'部门'列
print(df.loc[[0, 2], ['姓名', '部门']])
# 条件筛选:选择部门为'技术'的行
print(df.loc[df['部门'] == '技术'])
2. 按位置选择(iloc)
通过行号和列号(从 0 开始)来定位数据。
bash
# 选择第2行(索引1)、第3列(索引2)的值
print(df.iloc[1, 2]) # 输出:'市场'
# 选择前2行,前2列的数据
print(df.iloc[:2, :2])
3. 按列选择
直接通过列名进行选择,操作简洁高效。
lua
# 选择'年龄'列,返回Series
print(df['年龄'])
# 选择'姓名'和'年龄'列,返回DataFrame(注意使用双层列表)
print(df[['姓名', '年龄']])
四、数据清洗
实际业务中的数据往往存在缺失值、重复值或格式问题,需要进行清洗处理后才能用于分析。
1. 缺失值处理
首先检测缺失值,然后根据情况进行删除或填充。
ini
# 检测每列的缺失值数量
print(df.isnull().sum())
# 方案1:删除含有缺失值的行(axis=0)或列(axis=1)
# how='any'表示只要有缺失值就删除,how='all'表示所有值都缺失才删除
df_cleaned = df.dropna(axis=0, how='any')
# 方案2:填充缺失值
# 用'年龄'列的均值填充缺失值
df['年龄'].fillna(df['年龄'].mean(), inplace=True)
# 向前填充,用前一行的值填充缺失值
df['部门'].fillna(method='ffill', inplace=True)
2. 重复值处理
检测并删除重复的数据行。
ini
# 检测重复行,返回布尔值Series
print(df.duplicated())
# 按'姓名'列去重,保留第一次出现的行
df.drop_duplicates(subset=['姓名'], keep='first', inplace=True)
3. 数据类型转换
将数据转换为合适的类型,以便后续处理。
bash
# 将字符串类型的'日期'列转换为日期类型
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d')
# 将数值列转换为整数类型,适用于处理带小数点的ID等数据
df['用户ID'] = df['用户ID'].astype(int)
五、数据的转换与处理
对数据进行转换和处理,以满足分析需求,是数据分析过程中的重要环节。
1. 列运算
直接对列进行算术或逻辑操作,快速生成新的数据。
bash
# 新增'年龄_5年后'列,值为年龄加5
df['年龄_5年后'] = df['年龄'] + 5
# 新增'是否成年'列,判断年龄是否大于30,返回布尔值
df['是否成年'] = df['年龄'] > 30
2. 复杂转换(apply)
通过自定义函数对元素或行 / 列进行复杂的转换操作。
python
# 定义一个函数,根据年龄对人群进行分组
def age_group(age):
if age < 30:
return '青年'
else:
return '中年'
# 对'年龄'列应用自定义函数,生成'年龄分组'列
df['年龄分组'] = df['年龄'].apply(age_group)
# 对行应用lambda函数,将'姓名'和'部门'列拼接
print(df.apply(lambda row: row['姓名'] + '_' + row['部门'], axis=1))
3. 分组与聚合(groupby)
按某一列或多列对数据进行分组,然后对每组数据应用聚合函数进行分析。
go
# 按'部门'列进行分组
grouped = df.groupby('部门')
# 对分组后的'年龄'列应用'mean'和'count'函数,计算每组的平均年龄和人数
print(grouped['年龄'].agg(['mean', 'count']))
六、数据的合并与连接
在实际分析中,数据往往分散在多个表中,需要将它们合并起来进行综合分析,这类似于 SQL 中的 JOIN 操作。
ini
# 订单表
orders = pd.DataFrame({
'订单ID': [101, 102, 103],
'用户ID': [1, 2, 1],
'金额': [200, 300, 150]
})
# 用户表
users = pd.DataFrame({
'用户ID': [1, 2, 3],
'姓名': ['张三', '李四', '赵六']
})
# 内连接:只保留两表中用户ID相同的记录
inner_join = pd.merge(orders, users, on='用户ID', how='inner')
print(inner_join)
# 左连接:保留订单表中的所有记录,用户表中没有匹配的记录用NaN填充
left_join = pd.merge(orders, users, on='用户ID', how='left')
print(left_join)
七、时间序列处理
Pandas 对时间序列数据提供了强大的支持,能够方便地进行日期生成、重采样等操作。
ini
# 生成从2023-01-01到2023-01-10的日期范围,按天生成
dates = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
# 构建时间序列数据
ts = pd.Series(range(10), index=dates)
# 重采样:将日数据转换为周数据,并计算每周的总和
weekly_sum = ts.resample('W').sum()
print(weekly_sum)
# 提取日期中的年、月、日
print(ts.index.year) # 输出:[2023, 2023, ...]
print(ts.index.month) # 输出:[1, 1, ...]
八、数据的导入与导出
Pandas 支持多种文件格式的数据导入和导出,方便与其他工具进行数据交互。
ini
# 读取CSV文件,指定编码为utf-8,将'日期列'解析为日期类型
df = pd.read_csv('data.csv', encoding='utf-8', parse_dates=['日期列'])
# 读取Excel文件,指定工作表名称为'Sheet1'
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 将数据导出为CSV文件,忽略索引
df.to_csv('output.csv', index=False)
九、Pandas 的优缺点
优点
- 语法简洁易懂,贴近自然语言,学习成本较低;
- 内置功能丰富,涵盖了数据处理的全流程,能满足大部分分析需求;
- 基于 NumPy 实现,数值运算效率高,处理速度快;
- 与 Matplotlib、Scikit-learn 等其他 Python 库无缝衔接,便于构建完整的数据分析和建模流程。
缺点
- 处理超大规模数据(如 10GB 以上)时,内存占用较高,需要依赖 Dask 等分布式计算库;
- 在某些复杂操作(如自定义聚合)上,性能不如原生的 NumPy 或 SQL;
- 对并行计算的支持较弱,默认情况下采用单线程运行。
十、常见面试题
- loc 与 iloc 的区别:loc 是按标签索引来选择数据,iloc 是按位置索引来选择数据。
- 如何处理 SettingWithCopyWarning 警告:避免使用链式赋值,如df['a'][df['b']>1] = 0,应改用 loc 进行明确赋值,即df.loc[df['b']>1, 'a'] = 0。
- groupby 的原理是什么:主要分为三个步骤,首先按分组键拆分数据(split),然后对每个分组应用相应的函数(apply),最后将处理结果合并起来(combine)。
- 处理大数据有哪些技巧:可以通过指定 dtype 参数来减少内存占用,如用 int32 替代 int64;采用分块读取的方式,使用 chunksize 参数;先对数据进行筛选,保留需要的部分后再进行处理。
Pandas 虽然不是万能的,但在中小规模数据处理场景中,其效率和便捷性是无可替代的。熟练掌握 Pandas 的核心操作,是提升数据分析能力的关键,也是数据相关岗位面试中的重要加分项。