Pandas 数据处理 10 个高频操作,一篇就够

站长 2026-09-29 0 约 2 分钟 429 字
#Python#Pandas#数据分析#数据处理

为什么是 Pandas

处理表格数据,Excel 能做的事 Pandas 都能做,而且:

  • 快:几十万行数据秒级处理,Excel 早就卡死
  • 可复现:代码写一次,下个月的新数据重新跑一遍就行
  • 可串联:读数据 → 清洗 → 分析 → 出图一条龙
pip install pandas openpyxl  # openpyxl 用于读写 Excel

准备演示数据

后面的例子都用这份「销售数据」:

import pandas as pd

df = pd.DataFrame({
    "姓名": ["张三", "李四", "王五", "张三", "李四", "赵六"],
    "部门": ["华东", "华北", "华东", "华东", "华北", "华南"],
    "销售额": [12000, 8500, 15000, 13500, None, 9000],
    "入职日期": ["2023-01-15", "2023-03-20", "2022-11-05",
                 "2023-01-15", "2023-03-20", "2024-02-01"],
})

操作 1:读写 CSV / Excel

# 读取
df = pd.read_csv("sales.csv")                      # CSV
df = pd.read_excel("sales.xlsx", sheet_name="1月")  # Excel 指定工作表

# 中文乱码?指定编码
df = pd.read_csv("sales.csv", encoding="gbk")

# 保存(index=False 去掉行号,utf-8-sig 保证 Excel 打开不乱码)
df.to_csv("output.csv", index=False, encoding="utf-8-sig")
df.to_excel("output.xlsx", index=False)

操作 2:快速查看数据

拿到任何数据,先做这四个动作:

df.head()        # 前 5 行长什么样
df.info()        # 每列的类型、有没有缺失
df.describe()    # 数值列的统计:均值/最值/分位数
df.shape         # 几行几列

操作 3:选列与筛选行

# 选列
df["销售额"]                    # 单列(Series)
df[["姓名", "销售额"]]          # 多列(DataFrame)

# 条件筛选(最常用的操作,没有之一)
df[df["销售额"] > 10000]
df[df["部门"] == "华东"]
df[(df["销售额"] > 10000) & (df["部门"] == "华东")]  # 多条件用 & |,必须加括号

# 模糊匹配
df[df["姓名"].str.contains("张")]

# 在列表内匹配
df[df["部门"].isin(["华东", "华南"])]

操作 4:排序与去重

# 排序
df.sort_values("销售额", ascending=False)           # 按销售额降序
df.sort_values(["部门", "销售额"], ascending=[True, False])  # 先部门升序再销售额降序

# 去重
df.drop_duplicates()                      # 整行重复才删
df.drop_duplicates(subset=["姓名"])       # 同一人只留一条
df.drop_duplicates(subset=["姓名"], keep="last")  # 留最后一次出现的

操作 5:缺失值处理

# 查看缺失情况
df.isna().sum()      # 每列有几个缺失

# 处理:三选一
df.dropna()                              # 1. 删掉含缺失的行
df["销售额"].fillna(0)                   # 2. 填固定值
df["销售额"].fillna(df["销售额"].mean()) # 3. 填均值(数值列常用)

操作 6:分组聚合(groupby,核心中的核心)

「按部门统计销售额」这类需求的标准答案:

# 按部门分组,算销售额总和
df.groupby("部门")["销售额"].sum()

# 一次算多个统计量
df.groupby("部门")["销售额"].agg(["sum", "mean", "count"])

# 多列分组 + 不同列不同聚合
df.groupby("部门").agg(
    总销售额=("销售额", "sum"),
    人均销售额=("销售额", "mean"),
    人数=("姓名", "count"),
).reset_index()  # 把分组键变回普通列,方便后续处理

操作 7:新增计算列

# 直接运算
df["提成"] = df["销售额"] * 0.05

# 条件赋值:销售额过万的标记为「高」
import numpy as np
df["等级"] = np.where(df["销售额"] > 10000, "高", "普通")

# 对文本列做处理
df["姓名长度"] = df["姓名"].str.len()

操作 8:表合并(merge 与 concat)

# concat:上下堆叠(合并多个月份的同结构表格)
df_all = pd.concat([df_1月, df_2月, df_3月], ignore_index=True)

# merge:左右拼接(类似 SQL 的 JOIN)
df_员工 = pd.DataFrame({"姓名": ["张三", "李四"], "职级": ["P5", "P6"]})
df.merge(df_员工, on="姓名", how="left")  # 左连接:保留左表全部行

how 的四种取值:left(保留左表)、right、inner(交集)、outer(并集)。日常 90% 用 left。

操作 9:日期处理

# 字符串转日期
df["入职日期"] = pd.to_datetime(df["入职日期"])

# 提取年/月/星期几
df["入职年"] = df["入职日期"].dt.year
df["入职月"] = df["入职日期"].dt.month

# 按月统计
df.groupby(df["入职日期"].dt.to_period("M"))["销售额"].sum()

# 日期差(算工龄)
df["工龄天数"] = (pd.Timestamp.now() - df["入职日期"]).dt.days

操作 10:透视表(pivot_table)

Excel 透视表的代码版,多维交叉统计一把梭:

# 行=部门,列=等级,值=销售额总和
df.pivot_table(
    index="部门",
    columns="等级",
    values="销售额",
    aggfunc="sum",
    fill_value=0,      # 空位填 0
    margins=True,      # 加合计行列
)

避坑指南

1. SettingWithCopyWarning 警告

# 错误:先筛选再赋值,改的可能不是原表
df[df["部门"] == "华东"]["销售额"] = 0

# 正确:用 loc 一步定位
df.loc[df["部门"] == "华东", "销售额"] = 0

2. 链式赋值结果没生效

Pandas 很多操作返回新对象而不改原表。要么接返回值:

df = df.dropna()  # 接返回值
# 或者
df.dropna(inplace=True)  # 用 inplace 参数

3. 数字被读成字符串

CSV 里带「¥」「,」的数字会被当成文本,先清洗再计算:

df["销售额"] = df["销售额"].str.replace("¥", "").str.replace(",", "").astype(float)

写在最后

Pandas 的学习曲线不在语法而在思维转换:别写 for 循环逐行处理,学会用「向量化」的批量操作。遇到需求先问自己——这能不能用筛选、分组、合并这三板斧解决?90% 的情况答案是能。

评论 (0)

我的头像

还没有评论,快来抢沙发吧~