Pandas表格处理数据分析技巧

45 阅读5分钟

在Python数据分析领域,Pandas是处理结构化表格数据的核心工具,掌握其表格操作技巧能大幅提升数据处理效率。

一、Pandas基础准备:环境搭建与核心概念

1. 环境安装

首先确保安装了Pandas库,使用pip命令即可完成安装:

pip install pandas numpy  # numpy是Pandas的依赖库,建议同时安装

2. 核心数据结构

Pandas处理表格的核心是两个数据结构:

  • DataFrame:二维表格型数据结构,类似Excel工作表,由行索引(index)、列索引(columns)和数据值(values)组成;
  • Series:一维数组结构,可理解为DataFrame的单列数据,自带索引。

入门示例:创建一个简单的表格(DataFrame)

import pandas as pd

# 基于字典创建表格
data = {
    "姓名": ["张三", "李四", "王五", "赵六"],
    "年龄": [25, 32, 28, 40],
    "城市": ["北京", "上海", "广州", "深圳"],
    "薪资": [8000, 12000, 9500, 15000]
}
df = pd.DataFrame(data)
print(df)

输出结果:

   姓名  年龄  城市    薪资
0  张三  25  北京   8000
1  李四  32  上海  12000
2  王五  28  广州   9500
3  赵六  40  深圳  15000

二、表格数据读取:导入常见格式文件

实际分析中,数据常存储为Excel、CSV、JSON等格式,Pandas提供了简洁的读取方法:

1. 读取CSV文件

# 读取本地CSV文件
df_csv = pd.read_csv(
    "data.csv",          # 文件路径
    encoding="utf-8",    # 编码格式(中文常用utf-8/gbk)
    sep=",",             # 分隔符,CSV默认逗号
    header=0             # 用第0行作为列名
)

# 读取后预览前5行数据
print(df_csv.head())

2. 读取Excel文件

需先安装依赖库openpyxl(处理.xlsx)或xlrd(处理.xls):

pip install openpyxl
# 读取Excel文件(指定工作表)
df_excel = pd.read_excel(
    "data.xlsx",
    sheet_name="Sheet1",  # 指定工作表名称/索引
    usecols=["姓名", "年龄", "薪资"]  # 只读取指定列
)
print(df_excel.tail(3))  # 预览最后3行

三、表格数据清洗:处理缺失值与异常值

数据清洗是分析的基础,重点解决缺失值、重复值、异常值问题。

1. 处理缺失值

# 1. 检查缺失值(返回每列缺失值数量)
print(df.isnull().sum())

# 2. 填充缺失值(根据场景选择方式)
df["薪资"] = df["薪资"].fillna(df["薪资"].mean())  # 数值列用均值填充
df["城市"] = df["城市"].fillna("未知")             # 文本列用固定值填充

# 3. 删除缺失值(缺失行占比低时使用)
df_clean = df.dropna(subset=["姓名"], axis=0)  # 只删除"姓名"列缺失的行

2. 处理重复值

# 1. 检查重复行(返回布尔值)
print(df.duplicated())

# 2. 删除重复行(保留第一次出现的行)
df = df.drop_duplicates(subset=["姓名"], keep="first")

3. 处理异常值

以薪资为例,筛选出合理范围(如3000-50000)的数据:

# 筛选薪资在合理范围的行
df = df[(df["薪资"] >= 3000) & (df["薪资"] <= 50000)]

# 替换异常值为均值
mean_salary = df["薪资"].mean()
df.loc[df["薪资"] > 50000, "薪资"] = mean_salary

四、表格数据筛选与切片:精准提取数据

根据条件提取所需数据,是日常分析中最常用的操作。

1. 按列筛选

# 提取单列
name_series = df["姓名"]

# 提取多列
basic_info = df[["姓名", "年龄", "城市"]]

2. 按行筛选(条件过滤)

# 1. 单条件筛选:筛选年龄大于30岁的数据
df_30plus = df[df["年龄"] > 30]

# 2. 多条件筛选:年龄>25且薪资>10000(注意用&连接,条件加括号)
df_high_salary = df[(df["年龄"] > 25) & (df["薪资"] > 10000)]

# 3. 按值筛选:筛选城市为北京/上海的数据
df_bj_sh = df[df["城市"].isin(["北京", "上海"])]

3. 按索引筛选

# 1. 按行索引取值(iloc:按位置索引)
df.iloc[0]          # 第1行
df.iloc[1:3]        # 第2-3行
df.iloc[:, 0:2]     # 所有行,第1-2列

# 2. 按标签索引取值(loc:按列名/行名)
df.loc[df["姓名"] == "李四", "薪资"]  # 李四的薪资

五、表格数据转换:列操作与数据类型调整

1. 新增/修改列

# 1. 新增列:计算年薪(月薪*12)
df["年薪"] = df["薪资"] * 12

# 2. 基于条件新增列:薪资等级
df["薪资等级"] = pd.cut(
    df["薪资"],
    bins=[0, 8000, 15000, 50000],
    labels=["初级", "中级", "高级"]
)

# 3. 修改列名
df.rename(columns={"薪资": "月薪", "年薪": "年总收入"}, inplace=True)

2. 数据类型转换

# 查看当前数据类型
print(df.dtypes)

# 转换类型:年龄从int转为str,月薪从float转为int
df["年龄"] = df["年龄"].astype(str)
df["月薪"] = df["月薪"].astype(int)

六、表格数据聚合:分组统计与汇总

对数据按维度分组,计算均值、求和、计数等统计指标,挖掘数据规律。

1. 基础分组聚合

# 按城市分组,计算各城市的平均月薪、最高年龄
city_stats = df.groupby("城市").agg(
    平均月薪=("月薪", "mean"),
    最高年龄=("年龄", "max"),
    人数=("姓名", "count")
).reset_index()  # 重置索引,让城市成为普通列
print(city_stats)

2. 多维度分组

# 按城市+薪资等级分组,计算每组的年薪总和
group_stats = df.groupby(["城市", "薪资等级"]).agg(
    年薪总和=("年总收入", "sum")
).reset_index()
print(group_stats)

七、表格数据导出:保存处理结果

处理完成后,将数据导出为文件供后续使用:

# 导出为CSV文件
df.to_csv(
    "处理后数据.csv",
    index=False,  # 不保存行索引
    encoding="utf-8-sig"  # 解决中文乱码问题
)

# 导出为Excel文件
df.to_excel(
    "处理后数据.xlsx",
    sheet_name="清洗后数据",
    index=False
)

八、实战案例:员工薪资数据分析

结合以上操作,完成一个简单的分析案例:

import pandas as pd

# 1. 读取数据
df = pd.read_excel("员工数据.xlsx", sheet_name="员工信息")

# 2. 数据清洗
df["月薪"] = df["月薪"].fillna(df["月薪"].mean())  # 填充缺失值
df = df.drop_duplicates(subset=["员工编号"])        # 删除重复行
df = df[(df["月薪"] >= 3000) & (df["月薪"] <= 50000)]  # 过滤异常值

# 3. 数据转换
df["年薪"] = df["月薪"] * 12  # 计算年薪
df["薪资等级"] = pd.cut(
    df["月薪"],
    bins=[0, 8000, 15000, 50000],
    labels=["初级", "中级", "高级"]
)

# 4. 分组统计
city_salary = df.groupby("城市").agg(
    平均月薪=("月薪", "mean"),
    高级薪资人数=("薪资等级", lambda x: (x == "高级").sum())
).reset_index()

# 5. 导出结果
city_salary.to_csv("城市薪资统计.csv", index=False, encoding="utf-8-sig")
print("分析完成,结果已导出!")
print(city_salary)