HelloAI
L1 第 9 篇 🐣 难度 🕒 9 分钟

Pandas 数据处理:DataFrame 是 ML 数据的标准载体

看到 CSV、Excel 这些"表格数据",先用 Pandas 装起来再说。这是 ML 工程师每天用的工具。

阿莱
2026/6/22

NumPy 处理纯数字,但真实世界的 ML 数据通常是混合的——一列是数字、一列是文本、一列是日期。

这时候用 Pandas——它的核心数据结构 DataFrame 是 ML 数据的”瑞士军刀”。

读完这篇你能:读 CSV、清洗数据、做基本分析、转换给模型用。

第一站:什么是 DataFrame

DataFrame 就是带列名的二维表——Excel 的程序化版本。

import pandas as pd

# 从字典创建
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'age': [25, 32, 28, 45],
    'salary': [50000, 65000, 55000, 80000],
    'dept': ['Eng', 'Eng', 'Sales', 'HR'],
})

print(df)
#       name  age  salary   dept
# 0    Alice   25   50000    Eng
# 1      Bob   32   65000    Eng
# 2  Charlie   28   55000  Sales
# 3    Diana   45   80000     HR

每行是一个样本,每列是一个特征——和 ML 的数据形态完全对应。

第二站:读写文件

# CSV
df = pd.read_csv('data.csv')
df.to_csv('out.csv', index=False)

# Excel
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
df.to_excel('out.xlsx')

# JSON
df = pd.read_json('data.json')

# Parquet(大数据首选)
df = pd.read_parquet('data.parquet')

# 多个 CSV 拼接
import glob
all_files = glob.glob('data/*.csv')
df = pd.concat([pd.read_csv(f) for f in all_files])

90% 情况下用 read_csv 就够

第三站:快速看一眼数据

拿到新数据,第一件事永远是这几行:

df.head()        # 前 5 行
df.tail(3)       # 后 3 行
df.shape         # (行数, 列数)
df.info()        # 各列的数据类型 + 缺失情况
df.describe()    # 数字列的统计摘要(mean, std, min, max, 四分位)
df.columns       # 所有列名
df.dtypes        # 每列的类型
df['dept'].unique()       # 某列的唯一值
df['dept'].value_counts() # 某列的值分布
💡 新数据三连击

看到一个新 DataFrame,永远先跑这三行

df.shape         # 多大
df.head()        # 长啥样
df.info()        # 有缺失吗、类型对吗

30 秒内你对数据就有了基本认知。

第四站:选取数据

# 选一列(返回 Series,一维)
df['age']
df.age          # 等价(但列名不能有空格/特殊字符)

# 选多列(返回 DataFrame)
df[['name', 'age']]

# 按行号
df.iloc[0]           # 第 0 行
df.iloc[0:3]         # 前 3 行
df.iloc[0, 1]        # 第 0 行第 1 列

# 按条件筛选(这个超常用)
df[df['age'] > 30]                              # 30 岁以上
df[df['dept'] == 'Eng']                         # 工程部
df[(df['age'] > 25) & (df['salary'] > 60000)]   # 多条件

# isin
df[df['dept'].isin(['Eng', 'Sales'])]

第五站:添加/修改列

# 加一列(NumPy 一样的向量化)
df['salary_k'] = df['salary'] / 1000
df['is_senior'] = df['age'] > 30   # 返回布尔列
df['name_length'] = df['name'].str.len()

# 基于多列计算
df['bonus'] = df['salary'] * 0.1 * (df['age'] / 30)

# 用 apply 做复杂逻辑
def categorize_age(age):
    if age < 30: return 'young'
    elif age < 40: return 'mid'
    else: return 'senior'

df['age_group'] = df['age'].apply(categorize_age)

# 字符串操作
df['name_upper'] = df['name'].str.upper()
df['domain'] = df['email'].str.split('@').str[1]

第六站:处理缺失值

真实数据 90% 会有缺失(NaN):

# 检测缺失
df.isna()             # 每个元素是不是 NaN
df.isna().sum()       # 每列有多少 NaN
df.isna().any(axis=1) # 哪些行有任何 NaN

# 删除有缺失的行
df.dropna()

# 填充
df.fillna(0)                       # 用 0 填
df['age'].fillna(df['age'].mean()) # 用均值填(数值列常见)
df['dept'].fillna('Unknown')       # 用文本填
df.fillna(method='ffill')          # 用前一行的值

ML 训练前必须处理缺失值——大多数模型不接受 NaN 输入。

第七站:分组聚合(核心功能)

groupby 是 Pandas 的心脏:

# 按部门求平均工资
df.groupby('dept')['salary'].mean()
# dept
# Eng       57500.0
# HR        80000.0
# Sales     55000.0

# 多个聚合
df.groupby('dept').agg({
    'salary': ['mean', 'max', 'min'],
    'age': 'mean',
    'name': 'count'
})

# 排序
df.sort_values('salary', ascending=False)
df.sort_values(['dept', 'salary'], ascending=[True, False])

第八站:合并数据(join / merge)

# 两个 df
employees = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'name': ['Alice', 'Bob', 'Charlie', 'Diana']
})

salaries = pd.DataFrame({
    'id': [1, 2, 3, 5],
    'salary': [50000, 65000, 55000, 70000]
})

# inner join(默认):只保留两边都有的
pd.merge(employees, salaries, on='id')

# left join:保留左边所有,右边没有的填 NaN
pd.merge(employees, salaries, on='id', how='left')

# 用列名不同的字段连接
pd.merge(left, right, left_on='user_id', right_on='id')

SQL 熟的话,这就是 JOIN,逻辑完全一样

第九站:转给 ML 模型用

最后一步,把 DataFrame 转成 NumPy 给模型:

# 分离 X 和 y
X = df[['age', 'salary']].values   # .values 转 numpy
y = df['is_senior'].values

# One-hot 编码分类列
df_encoded = pd.get_dummies(df, columns=['dept'])
# 'dept' 列变成 'dept_Eng', 'dept_HR', 'dept_Sales' 三列 0/1

# 标准化数值(防止量纲不同导致模型偏向某些特征)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

实战:5 行代码做一份数据分析

假设你有一份销售记录 CSV:

import pandas as pd

# 1. 读数据
df = pd.read_csv('sales.csv')

# 2. 看一眼
print(df.head())
print(df.describe())

# 3. 按产品和月份算销售额
summary = df.groupby(['product', 'month'])['revenue'].sum().unstack()

# 4. 找销售额最高的 5 个产品
top5 = df.groupby('product')['revenue'].sum().nlargest(5)
print(top5)

# 5. 把结果存回 Excel 给老板
summary.to_excel('monthly_report.xlsx')

5 步搞定一份周报——这就是 Pandas 在工业界的日常。

💡 Pandas 学习心法

不要一次性把所有方法都背下来。Pandas 有 5000+ API,没人能记全。

学习方式:遇到具体任务 → Google “Pandas 怎么 …” → 抄答案 → 自己改。 两个月后你能写出 60% 的常见操作,剩下的查文档。

ChatGPT/Claude 在 Pandas 操作上特别准——遇到不会的直接问 AI。

一句话总结

Pandas = Python 版的 Excel + SQL。 它是 ML 数据预处理的事实标准。学会它,你能处理任何”表格数据”。

下一篇:《PyTorch 基础:张量、自动求导、第一个神经网络》 —— 把 L1 的数学和工具组合起来,跑出你的第一个真神经网络。

📬

读到这里说明你认真在学 🎯

订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。

💬

讨论区

· 用 GitHub 账号登录评论
⚠️ Giscus 评论未配置 —— 在 src/components/Comments.astro 顶部填入 仓库 ID 和分类 ID(见组件注释里的配置步骤)。