别再死记硬背了!用Pandas处理Excel和CSV数据的5个高频场景(附代码)

刚接触数据分析时,最让人头疼的莫过于面对一堆杂乱无章的Excel或CSV文件。业务部门发来的数据可能包含重复记录、缺失值、格式混乱等问题,而你的任务是在最短时间内将其整理成可分析的整洁数据。Pandas作为Python数据分析的瑞士军刀,能帮你高效解决这些实际问题。

我刚开始工作时,经常为了处理一个简单的数据合并任务而折腾半天。后来发现,掌握Pandas的几个核心场景就能解决80%的日常数据处理需求。下面分享5个最实用的场景,每个都配有可直接运行的代码示例。

1. 数据合并:快速整合多个来源的业务数据

业务部门经常提供多个Excel文件,每个文件包含部分数据。传统做法是手动复制粘贴,既耗时又容易出错。Pandas的concat和merge函数能完美解决这个问题。

1.1 纵向合并相同结构的数据

假设你收到三个部门的销售数据,结构相同但分散在不同文件中:

import pandas as pd

# 读取三个部门的Excel文件
dept1 = pd.read_excel('sales_dept1.xlsx')
dept2 = pd.read_excel('sales_dept2.xlsx') 
dept3 = pd.read_excel('sales_dept3.xlsx')

# 使用concat合并
all_sales = pd.concat([dept1, dept2, dept3], ignore_index=True)

注意:ignore_index=True会重置行索引,避免出现重复索引

1.2 横向关联不同数据表

当需要根据ID关联客户信息和订单数据时:

customers = pd.read_csv('customers.csv')
orders = pd.read_csv('orders.csv')

# 根据customer_id关联两个表
merged_data = pd.merge(customers, orders, on='customer_id', how='left')

合并方式对比表:

合并方式 说明 适用场景
inner 只保留两表都有的键 数据完全匹配时
left 保留左表所有记录 以左表为基准
right 保留右表所有记录 以右表为基准
outer 保留所有记录 需要全量数据时

2. 缺失值处理:智能填充不完整数据

真实业务数据总会有缺失,常见处理方法有:

  • 删除缺失行:适合缺失比例小的数据
  • 填充固定值:适合类别型变量
  • 填充统计值:适合数值型变量
  • 插值法:适合时间序列数据

2.1 自动填充缺失值

# 查看各列缺失情况
print(data.isnull().sum())

# 填充缺失值
data['age'] = data['age'].fillna(data['age'].median())  # 中位数填充
data['department'] = data['department'].fillna('Unknown')  # 固定值填充

2.2 高级填充技巧

对于时间序列数据,可以使用插值法:

# 线性插值
data['sales'] = data['sales'].interpolate(method='linear')

# 向前填充
data['inventory'] = data['inventory'].fillna(method='ffill')

3. 重复数据处理:一键清理冗余记录

重复数据会扭曲分析结果,Pandas提供了多种去重方式:

3.1 基本去重方法

# 标记重复行
print(data.duplicated(subset=['order_id']))

# 删除完全重复的行
data.drop_duplicates(inplace=True)

# 基于关键字段去重
data.drop_duplicates(subset=['customer_id', 'order_date'], keep='last', inplace=True)

3.2 高级去重策略

有时需要先清洗数据再判断重复:

# 标准化文本后去重
data['product_name'] = data['product_name'].str.strip().str.lower()
data.drop_duplicates(subset=['product_name'], inplace=True)

4. 数据类型转换:规范数据格式

常见的数据类型问题包括:

  • 数字存储为文本
  • 日期识别为字符串
  • 布尔值显示为是/否

4.1 基本类型转换

# 转换为数值类型
data['price'] = pd.to_numeric(data['price'], errors='coerce')

# 转换为日期类型
data['order_date'] = pd.to_datetime(data['order_date'], format='%Y-%m-%d')

# 转换为分类变量
data['category'] = data['category'].astype('category')

4.2 自定义转换函数

# 自定义转换函数
def convert_status(text):
    return True if text.lower() == 'active' else False

data['is_active'] = data['status'].apply(convert_status)

5. 分组统计:快速生成业务洞察

分组统计是数据分析的核心操作,Pandas的groupby功能非常强大。

5.1 基本聚合计算

# 按地区统计销售总额和平均订单额
report = data.groupby('region').agg({
    'sales': ['sum', 'mean'],
    'order_id': 'count'
})

# 重命名列
report.columns = ['total_sales', 'avg_sale', 'order_count']

5.2 复杂分组分析

# 多级分组和多种聚合
result = data.groupby(['region', 'product_category']).agg({
    'sales': ['sum', lambda x: x.sum() / x.count()],
    'profit': ['mean', 'median']
})

# 添加百分比计算
result['sales_pct'] = result['sales']['sum'] / result['sales']['sum'].sum() * 100

实际项目中,我发现groupby结合agg可以解决90%的日常统计需求。一个常见错误是忘记reset_index(),导致分组列变成索引,影响后续操作:

# 正确做法
report = data.groupby('region').size().reset_index(name='counts')

掌握这5个核心场景后,你会发现Pandas处理日常业务数据变得异常简单。刚开始可能会忘记一些参数,但实践几次后就会形成肌肉记忆。建议把这些代码片段保存为代码模板,遇到类似任务时稍作修改就能使用。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐