Python爬虫实战⑯|Pandas入门,数据读取与基本操作
·
author: 专注Python实战,分享爬虫与数据分析干货
title: Python爬虫实战⑯|Pandas入门,数据读取与基本操作
update: 2026-04-26
tags: Python,Pandas,数据分析,DataFrame,Series,数据读取
作者:专注Python实战,分享爬虫与数据分析干货
更新时间:2026年4月
适合人群:有Python基础、想学习数据分析的爬虫工程师
前言:爬虫抓了数据,下一步是什么?
爬虫抓了10万条数据,存在CSV里。接下来——
- 筛选出评分最高的100条
- 按城市统计平均价格
- 找出异常数据(价格异常低/高)
- 生成统计报表
Pandas = Python数据分析的核心库。 爬虫负责"抓",Pandas负责"分析"。
一、安装与基本概念
pip install pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
两个核心数据结构:
import pandas as pd
# Series:一维数组(一列数据)
s = pd.Series([90, 85, 78, 92])
print(s)
# 0 90
# 1 85
# 2 78
# 3 92
# dtype: int64
# DataFrame:二维表格(多列数据,Excel表)
df = pd.DataFrame({
"姓名": ["张三", "李四", "王五", "赵六"],
"数学": [90, 85, 78, 92],
"语文": [88, 92, 80, 85],
"英语": [95, 78, 88, 90],
})
print(df)
二、读取数据
2.1 读取CSV
import pandas as pd
# 最基础的读取
df = pd.read_csv("movies.csv")
print(df.head()) # 前5行
print(df.tail()) # 后5行
print(df.shape) # 形状(行数,列数)
print(df.columns) # 列名
print(df.dtypes) # 每列数据类型
# 读取时指定编码(中文文件常需要)
df = pd.read_csv("movies.csv", encoding="utf-8-sig") # 推荐,中文不乱码
df = pd.read_csv("movies.csv", encoding="gbk") # Windows老文件
# 只读取部分行
df = pd.read_csv("movies.csv", nrows=100) # 只读前100行
# 跳过行
df = pd.read_csv("movies.csv", skiprows=2) # 跳过前2行
df = pd.read_csv("movies.csv", skiprows=[1, 3]) # 跳过第1、3行
# 指定分隔符
df = pd.read_csv("movies.tsv", sep="\t") # TSV文件
df = pd.read_csv("movies.txt", sep="|") # 管道分隔
2.2 读取Excel
import pandas as pd
# 读取Excel
df = pd.read_excel("movies.xlsx") # 读第一个sheet
df = pd.read_excel("movies.xlsx", sheet_name=0) # 按索引
df = pd.read_excel("movies.xlsx", sheet_name="Sheet1") # 按名称
# 读取所有sheet
all_sheets = pd.read_excel("movies.xlsx", sheet_name=None)
# 返回字典:{"Sheet1": DataFrame, "Sheet2": DataFrame, ...}
# 读取时跳过行
df = pd.read_excel("movies.xlsx", skiprows=1) # 跳过标题行
# 读取指定列
df = pd.read_excel("movies.xlsx", usecols=["标题", "评分", "价格"])
df = pd.read_excel("movies.xlsx", usecols=[0, 2, 4]) # 按列索引
2.3 读取JSON
import pandas as pd
# 读取JSON(普通格式)
df = pd.read_json("data.json")
# 读取JSON Lines
df = pd.read_json("data.jsonl", lines=True)
# 从API读取JSON
import requests
response = requests.get("https://api.example.com/data")
data = response.json()
df = pd.DataFrame(data["results"]) # 根据JSON结构转换
2.4 读取HTML表格
import pandas as pd
# 抓取网页上的表格(最常见的用法:网页表格转DataFrame)
tables = pd.read_html("https://example.com/stock.html")
# 返回所有找到的表格列表
df = tables[0] # 取第一个表格
print(df.head())
# 常用参数
df = pd.read_html("https://example.com/table.html", match="股票代码")[0]
# match:只匹配包含指定文字的表格
2.5 读取MySQL/MongoDB
import pandas as pd
import pymongo
# 从MySQL读取
import pymysql
conn = pymysql.connect(host="localhost", user="root", password="xxx", database="mydb")
df = pd.read_sql("SELECT * FROM movies WHERE rating > 9", conn)
conn.close()
# 从MongoDB读取
client = pymongo.MongoClient("mongodb://localhost:27017")
db = client["mydb"]
cursor = db["movies"].find({"rating": {"$gt": 9}})
df = pd.DataFrame(list(cursor))
client.close()
三、数据查看
import pandas as pd
df = pd.read_csv("movies.csv", encoding="utf-8-sig")
# 基本信息
print(df.info()) # 数据类型、缺失值、内存占用
print(df.describe()) # 数值列的统计(均值、标准差、最大最小等)
print(df.describe(include="all")) # 包含所有列的统计
# 查看数据
print(df.head(10)) # 前10行
print(df.tail(5)) # 后5行
print(df.sample(5)) # 随机5行
print(df.columns) # 列名列表
print(df.index) # 索引
print(df.shape) # (行数, 列数)
# 查看某列
print(df["标题"]) # Series形式
print(df[["标题", "评分"]]) # DataFrame形式
# 查看数据类型
print(df.dtypes)
四、数据选择
4.1 按列选择
# 单列 → Series
title = df["标题"]
# 单列 → DataFrame(双括号)
title_df = df[["标题"]]
# 多列 → DataFrame
subset = df[["标题", "评分", "评价人数"]]
4.2 按行选择(索引)
# 按位置(类似列表切片)
print(df.iloc[0]) # 第1行(Series)
print(df.iloc[0:5]) # 前5行
print(df.iloc[-5:]) # 最后5行
print(df.iloc[[0, 3, 5]]) # 第1、4、6行
# 按标签
print(df.loc[0]) # 索引为0的行
print(df.loc[0:5]) # 索引0到5(包含)
# 布尔索引(最重要!)
high_rated = df[df["评分"] >= 9.0] # 评分>=9的电影
cheap = df[df["价格"] < 50] # 价格<50的商品
recent = df[df["年份"] >= 2020] # 2020年以后的
# 组合条件
condition = (df["评分"] >= 9.0) & (df["评价人数"] > 100000)
popular = df[condition]
# 或条件
condition = (df["分类"] == "动作") | (df["分类"] == "科幻")
action_scifi = df[condition]
# 排除条件
not_drama = df[df["分类"] != "剧情"]
4.3 按行和列同时选择
# iloc[行, 列]
print(df.iloc[0, 0]) # 第1行第1列(单个值)
print(df.iloc[0:5, 0:3]) # 前5行前3列
print(df.iloc[:, [0, 2, 4]]) # 所有行,第1、3、5列
# loc[行标签, 列标签]
print(df.loc[0, "标题"]) # 索引0的行,标题列
print(df.loc[0:5, ["标题", "评分"]]) # 前5行,指定列
4.4 条件筛选实战
import pandas as pd
df = pd.read_csv("movies.csv", encoding="utf-8-sig")
# 评分>=9.0的电影
top_movies = df[df["评分"] >= 9.0]
print(f"9分以上电影: {len(top_movies)} 部")
# 2020年后的动作片
recent_action = df[(df["年份"] >= 2020) & (df["分类"] == "动作")]
print(f"近年动作片: {len(recent_action)} 部")
# 评分高且评价人数多的电影
hot = df[(df["评分"] >= 8.5) & (df["评价人数"] > 500000)]
print(f"热门电影: {len(hot)} 部")
# 包含关键词的电影
python_related = df[df["标题"].str.contains("Python", na=False)]
print(f"Python相关: {len(python_related)} 部")
五、列操作
# 重命名列
df = df.rename(columns={"旧名": "新名", "评分": "得分"})
# 新增列
df["新列"] = df["评分"] * 2
df["差值"] = df["评分"] - df["基准分"]
# 删除列
df = df.drop(columns=["无用列1", "无用列2"])
df = df.drop("无用列", axis=1)
# 更改列顺序
df = df[["重要列1", "重要列2", "重要列3", "其他列"]]
# 类型转换
df["评分"] = df["评分"].astype(float)
df["年份"] = pd.to_numeric(df["年份"], errors="coerce") # 无法转换的变为NaN
df["日期"] = pd.to_datetime(df["日期"]) # 转日期类型
六、排序
# 按单列排序
df_sorted = df.sort_values("评分", ascending=False) # 降序
df_sorted = df.sort_values("评分", ascending=True) # 升序
# 按多列排序
df_sorted = df.sort_values(["评分", "评价人数"], ascending=[False, False])
# 按索引排序
df_sorted = df.sort_index()
# 重置索引
df = df.reset_index(drop=True) # drop=True删除旧索引
七、缺失值处理
# 检查缺失值
print(df.isnull()) # 每个单元格是否为NaN
print(df.isnull().sum()) # 每列有多少个NaN
print(df.notnull().sum()) # 每列有多少个非NaN
# 删除缺失值
df_clean = df.dropna() # 删除有NaN的行
df_clean = df.dropna(how="all") # 只删除全部为NaN的行
df_clean = df.dropna(subset=["关键列"]) # 只看指定列
# 填充缺失值
df["评分"] = df["评分"].fillna(df["评分"].mean()) # 用均值填充
df["评分"] = df["评分"].fillna(0) # 用0填充
df["评论"] = df["评论"].fillna("暂无评论") # 用固定值填充
df["评分"] = df["评分"].fillna(method="ffill") # 用前一个值填充
df["评分"] = df["评分"].fillna(method="bfill") # 用后一个值填充
八、知识卡
| 方法 | 说明 |
|---|---|
| pd.read_csv() | 读取CSV |
| pd.read_excel() | 读取Excel |
| pd.read_json() | 读取JSON |
| pd.read_html() | 读取HTML表格 |
| pd.read_sql() | 读取数据库 |
| df.head() / tail() | 查看前/后几行 |
| df.info() / describe() | 数据信息/统计 |
| df[“列名”] | 选择单列 |
| df[[“列1”, “列2”]] | 选择多列 |
| df.iloc[行, 列] | 按位置选择 |
| df.loc[行标签, 列名] | 按标签选择 |
| df[条件] | 布尔筛选 |
| df.sort_values() | 按列排序 |
| df.dropna() | 删除空值 |
| df.fillna() | 填充空值 |
九、课后作业
必做题:
- 读取一个CSV文件,查看基本信息
- 用布尔索引筛选出满足条件的行
- 对数据进行排序和去重
选做题:
- 读取Excel的多个sheet并合并
- 用Pandas分析爬虫抓取的数据
有问题欢迎评论区留言,大家一起讨论!
标签:Python | Pandas | 数据分析 | DataFrame | Series | 数据读取
更多推荐
所有评论(0)