在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)