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() 填充空值

九、课后作业

必做题:

  1. 读取一个CSV文件,查看基本信息
  2. 用布尔索引筛选出满足条件的行
  3. 对数据进行排序和去重

选做题:

  1. 读取Excel的多个sheet并合并
  2. 用Pandas分析爬虫抓取的数据

有问题欢迎评论区留言,大家一起讨论!


标签:Python | Pandas | 数据分析 | DataFrame | Series | 数据读取

更多推荐