一篇文章带你了解Pandassssssssssssssss

在 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 的优缺点

优点

  1. 语法简洁易懂,贴近自然语言,学习成本较低;
  1. 内置功能丰富,涵盖了数据处理的全流程,能满足大部分分析需求;
  1. 基于 NumPy 实现,数值运算效率高,处理速度快;
  1. 与 Matplotlib、Scikit-learn 等其他 Python 库无缝衔接,便于构建完整的数据分析和建模流程。

缺点

  1. 处理超大规模数据(如 10GB 以上)时,内存占用较高,需要依赖 Dask 等分布式计算库;
  1. 在某些复杂操作(如自定义聚合)上,性能不如原生的 NumPy 或 SQL;
  1. 对并行计算的支持较弱,默认情况下采用单线程运行。

十、常见面试题

  1. loc 与 iloc 的区别:loc 是按标签索引来选择数据,iloc 是按位置索引来选择数据。
  1. 如何处理 SettingWithCopyWarning 警告:避免使用链式赋值,如df['a'][df['b']>1] = 0,应改用 loc 进行明确赋值,即df.loc[df['b']>1, 'a'] = 0。
  1. groupby 的原理是什么:主要分为三个步骤,首先按分组键拆分数据(split),然后对每个分组应用相应的函数(apply),最后将处理结果合并起来(combine)。
  1. 处理大数据有哪些技巧:可以通过指定 dtype 参数来减少内存占用,如用 int32 替代 int64;采用分块读取的方式,使用 chunksize 参数;先对数据进行筛选,保留需要的部分后再进行处理。

Pandas 虽然不是万能的,但在中小规模数据处理场景中,其效率和便捷性是无可替代的。熟练掌握 Pandas 的核心操作,是提升数据分析能力的关键,也是数据相关岗位面试中的重要加分项。

相关推荐
仰望星空的凡人27 分钟前
【JS逆向基础】数据库之MongoDB
javascript·数据库·python·mongodb
F_D_Z1 小时前
【PyTorch】图像多分类项目部署
人工智能·pytorch·python·深度学习·分类
pingzhuyan2 小时前
python入门篇12-虚拟环境conda的安装与使用
python·ai·llm·ocr·conda
香蕉可乐荷包蛋2 小时前
排序算法 (Sorting Algorithms)-Python示例
python·算法·排序算法
菜鸟学Python4 小时前
Python web框架王者 Django 5.0发布:20周年了!
前端·数据库·python·django·sqlite
旧时光巷5 小时前
【机器学习-4】 | 集成学习 / 随机森林篇
python·随机森林·机器学习·集成学习·sklearn·boosting·bagging
Ice__Cai6 小时前
Django + Celery 详细解析:构建高效的异步任务队列
分布式·后端·python·django
MediaTea6 小时前
Python 库手册:doctest 文档测试模块
开发语言·python·log4j
2025年一定要上岸6 小时前
【pytest高阶】源码的走读方法及插件hook
运维·前端·python·pytest
angushine6 小时前
Python将Word转换为Excel
python·word·excel