跳到主要内容Python pandas 数据分析入门与实战 | 极客日志PythonAI算法
Python pandas 数据分析入门与实战
Python pandas 是 Python 数据分析核心库,提供 Series 和 DataFrame 结构。内容涵盖安装导入、数据读写、清洗(缺失值/重复值)、筛选分组聚合及排序。包含实战案例分析用户数据,并总结乱码、内存不足及 SettingWithCopyWarning 等常见问题处理。适合数据分析初学者快速上手。
墨染流年25 浏览 一、什么是 pandas?为什么要学它?
pandas 是 Python 的一个开源数据分析库,诞生于 2008 年,名字来源于'Panel Data'(面板数据)。它基于 NumPy 构建,提供了两种核心数据结构(Series 和 DataFrame),以及一系列便捷的函数,能轻松处理表格型数据。
为什么 pandas 是数据分析必备?
- 简洁高效:一行代码完成 Excel 中复杂的筛选、透视操作;
- 功能全面:支持数据读取、清洗、转换、分组、合并等全流程;
- 兼容性强:可与 NumPy、Matplotlib、Scikit-learn 等库无缝配合;
- 处理量大:比纯 Python 循环快 10-100 倍,适合中等规模数据集。
二、安装与导入
1. 安装 pandas
pandas 不是 Python 标准库,需用 pip 安装(建议同时安装依赖库 openpyxl,用于处理 Excel 文件):
pip install pandas
pip install pandas openpyxl
2. 导入 pandas
惯例将 pandas 简写为 pd(行业通用约定):
import pandas as pd
三、核心数据结构:Series 与 DataFrame
pandas 的所有操作都围绕两种核心结构展开:Series(一维数组) 和 DataFrame(二维表格)。
1. Series:带标签的一维数组
Series 类似 Python 列表,但每个元素都有一个'标签'(索引,index)。
(1)创建 Series
s1 = pd.Series([10, 20, 30, 40])
print("s1:\n", s1)
s2 = pd.Series([10, 20, 30], index=["a", "b", "c"])
print("\ns2:\n", s2)
s3 = pd.Series({"北京": 2000, : , : })
(, s3)
"上海"
2500
"广州"
1800
print
"\ns3:\n"
(2)访问 Series 元素
s = pd.Series([10, 20, 30, 40], index=["a", "b", "c", "d"])
print(s["b"])
print(s[1])
print(s["b":"d"])
2. DataFrame:二维表格数据
DataFrame 是 pandas 中最常用的结构,类似 Excel 表格或数据库表。
(1)创建 DataFrame
data = [{"name": "张三", "age": 25, "city": "北京"}, {"name": "李四", "age": 22, "city": "上海"}]
df1 = pd.DataFrame(data)
print("df1:\n", df1)
data = {"name": ["张三", "李四"], "age": [25, 22], "city": ["北京", "上海"]}
df2 = pd.DataFrame(data, index=["u1", "u2"])
print("\ndf2:\n", df2)
(2)DataFrame 的基本属性
df = pd.DataFrame({"name": ["张三", "李四"], "age": [25, 22], "city": ["北京", "上海"]})
print("形状(行,列):", df.shape)
print("列名:", df.columns)
print("行索引:", df.index)
print("数据类型:\n", df.dtypes)
四、数据读取与写入
pandas 支持读取/写入多种文件格式(CSV、Excel、JSON、SQL 等)。
1. 读取数据
(1)读取 CSV 文件
df = pd.read_csv("data.csv", encoding="utf-8")
df = pd.read_csv("no_header.csv", header=None, names=["col1", "col2", "col3"])
(2)读取 Excel 文件
df = pd.read_excel("data.xlsx", sheet_name="用户数据", engine="openpyxl")
(3)读取 JSON 文件
df = pd.read_json("data.json", encoding="utf-8")
2. 写入数据
(1)写入 CSV
df.to_csv("output.csv", index=False, encoding="utf-8")
(2)写入 Excel
df.to_excel("output.xlsx", sheet_name="结果数据", index=False, engine="openpyxl")
五、数据查看与筛选
1. 查看数据基本信息
df = pd.read_csv("user_data.csv")
print("前 5 行:\n", df.head())
print("\n后 3 行:\n", df.tail(3))
print("\n统计信息:\n", df.describe())
print("\n数据信息:")
df.info()
2. 数据筛选:按列、按条件
(1)选择列
df = pd.DataFrame({"name": ["张三", "李四"], "age": [25, 22], "city": ["北京", "上海"], "salary": [15000, 12000]})
print("年龄列:\n", df["age"])
print("\n姓名和薪资:\n", df[["name", "salary"]])
(2)按条件筛选行
cond1 = df["age"] > 24
print("年龄>24 的用户:\n", df[cond1])
cond2 = (df["salary"] > 13000) & (df["city"] == "北京")
print("\n薪资>13000 且北京的用户:\n", df[cond2])
cond3 = df["city"].isin(["上海", "广州"])
print("\n城市是上海或广州的用户:\n", df[cond3])
(3)按位置筛选(iloc)
print("第 0 行:\n", df.iloc[0])
print("\n第 1-2 行:\n", df.iloc[1:3])
print("\n第 0 行第 1 列:", df.iloc[0, 1])
print("\n多行多列:\n", df.iloc[0:2, 0:3])
(4)按标签筛选(loc)
df = df.set_index("name")
print("李四的信息:\n", df.loc["李四"])
print("\n指定行列范围:\n", df.loc["张三":"王五", "age":"salary"])
六、数据清洗:处理缺失值与重复值
1. 处理缺失值(NaN)
df = pd.DataFrame({"name": ["张三", "李四", None, "王五"], "age": [25, None, 30, 35], "city": ["北京", "上海", None, "广州"]})
print("原始数据:\n", df)
print("\n缺失值数量:\n", df.isnull().sum())
df_drop = df.dropna()
print("\n删除缺失值后的行:\n", df_drop)
df_fill = df.copy()
df_fill["age"] = df_fill["age"].fillna(df_fill["age"].mean())
df_fill["name"] = df_fill["name"].fillna("未知")
df_fill["city"] = df_fill["city"].fillna("未知城市")
print("\n填充缺失值后:\n", df_fill)
2. 处理重复值
df = pd.DataFrame({"name": ["张三", "李四", "张三", "王五"], "age": [25, 22, 25, 30], "city": ["北京", "上海", "北京", "广州"]})
print("原始数据:\n", df)
print("\n重复行标记:\n", df.duplicated())
df_unique = df.drop_duplicates()
print("\n删除重复行后:\n", df_unique)
df_unique_name = df.drop_duplicates(subset=["name"])
print("\n按 name 去重后:\n", df_unique_name)
七、数据转换:列操作与排序
1. 新增/修改列
df = pd.DataFrame({"name": ["张三", "李四", "王五"], "age": [25, 22, 30], "salary": [15000, 12000, 18000]})
df["annual_salary"] = df["salary"] * 12
print("新增年薪列:\n", df)
df.loc[df["age"] > 28, "salary"] += 1000
print("\n修改后薪资:\n", df)
df_drop_col = df.drop(columns=["annual_salary"])
print("\n删除列后:\n", df_drop_col)
2. 排序数据
df = pd.DataFrame({"name": ["张三", "李四", "王五"], "age": [25, 22, 30], "salary": [15000, 12000, 18000]})
df_sorted_age = df.sort_values(by="age")
print("按年龄升序:\n", df_sorted_age)
df_sorted_multi = df.sort_values(by=["age", "salary"], ascending=[False, True])
print("\n多列排序:\n", df_sorted_multi)
八、分组与聚合:数据统计分析
df = pd.DataFrame({"name": ["张三", "李四", "王五", "赵六", "孙七"], "city": ["北京", "北京", "上海", "上海", "北京"], "age": [25, 30, 22, 28, 35], "salary": [15000, 18000, 12000, 16000, 20000]})
group_city = df.groupby("city")
agg_result = group_city.agg({"age": "mean", "salary": "sum"})
print("分组聚合结果:\n", agg_result)
print("\n每个城市的人数:\n", group_city.size())
九、实战案例:用户数据分析
用一个完整案例串联前面的知识点:分析用户数据(CSV 文件)。
import pandas as pd
df = pd.read_csv("user_data.csv", encoding="utf-8")
print("原始数据形状:", df.shape)
print("前 3 行数据:\n", df.head(3))
print("\n缺失值数量:\n", df.isnull().sum())
df["age"] = df["age"].fillna(df["age"].mean())
df["city"] = df["city"].fillna("未知城市")
df = df.drop_duplicates(subset=["user_id"])
print("\n去重后数据形状:", df.shape)
city_count = df["city"].value_counts()
print("\n各城市用户数量:\n", city_count)
city_agg = df.groupby("city").agg({"age": "mean", "salary": "mean"}).round(2)
print("\n各城市平均年龄和薪资:\n", city_agg)
high_income = df[df["salary"] > 15000]
high_income.to_csv("high_income_users.csv", index=False, encoding="utf-8")
print(f"\n高收入用户(薪资>15000)共{len(high_income)}人,已保存到文件。")
十、常见问题与解决
1. 中文乱码问题
问题:读取/写入文件时中文显示乱码。
解决:读取和写入时指定 encoding="utf-8" 或 encoding="gbk":
df = pd.read_csv("data.csv", encoding="utf-8")
df.to_csv("output.csv", encoding="utf-8", index=False)
2. SettingWithCopyWarning 警告
问题:修改 DataFrame 子集时出现警告。
原因:pandas 无法确定你是否在修改副本还是原数据。
解决:用 loc 一次性完成筛选和修改:
df.loc[df["age"] > 30, "salary"] += 1000
3. 处理大型数据时内存不足
问题:读取百万级以上行数据时,内存占用过高。
解决:
- 用
dtype 指定列的数据类型(如将 int64 改为 int32,object 改为 category 节省内存);
- 分块读取:
pd.read_csv("big_data.csv", chunksize=10000)。
4. 时间格式处理错误
问题:日期列被识别为字符串(object 类型)。
解决:读取时用 parse_dates 指定日期列,或用 pd.to_datetime() 转换:
df = pd.read_csv("data.csv", parse_dates=["birth_date"])
df["birth_date"] = pd.to_datetime(df["birth_date"], format="%Y-%m-%d")
十一、总结与学习建议
pandas 的核心价值在于 '用简洁的代码实现复杂的数据处理'。
学习建议:
- 多练基础操作:Series 和 DataFrame 的创建、筛选、清洗是一切的基础;
- 结合实际数据:找一份真实数据集(如 Kaggle 上的 CSV),尝试复现本文的案例;
- 善用官方文档:pandas 功能丰富,遇到问题先查文档(pandas 官方文档);
- 熟悉快捷键:在 Jupyter Notebook 中用
df.+Tab 键查看可用方法,提高效率。
掌握 pandas 后,你会发现数据分析不再是'体力活',而是'用代码快速验证想法'的过程。无论是数据分析师、算法工程师还是后端开发,pandas 都是必备技能。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online