Pandas 数据处理:DataFrame 是 ML 数据的标准载体
看到 CSV、Excel 这些"表格数据",先用 Pandas 装起来再说。这是 ML 工程师每天用的工具。
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 有 5000+ API,没人能记全。
学习方式:遇到具体任务 → Google “Pandas 怎么 …” → 抄答案 → 自己改。 两个月后你能写出 60% 的常见操作,剩下的查文档。
ChatGPT/Claude 在 Pandas 操作上特别准——遇到不会的直接问 AI。
一句话总结
Pandas = Python 版的 Excel + SQL。 它是 ML 数据预处理的事实标准。学会它,你能处理任何”表格数据”。
下一篇:《PyTorch 基础:张量、自动求导、第一个神经网络》 —— 把 L1 的数学和工具组合起来,跑出你的第一个真神经网络。
读到这里说明你认真在学 🎯
订阅每周精选 —— 下一篇新文章 / 新可视化第一时间送到邮箱。
讨论区
· 用 GitHub 账号登录评论src/components/Comments.astro 顶部填入
仓库 ID 和分类 ID(见组件注释里的配置步骤)。