Pandas 数据处理¶
一句话概述:Pandas 是 Python 数据分析的核心库,DataFrame 让你像操作 Excel 一样处理表格数据,支持读写 CSV/Excel/SQL、数据清洗、分组聚合、时间序列。Pandas 3.0(2026.01)默认启用 PyArrow 字符串类型。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| DataFrame | 数据表 = 二维表格(行+列,类似 Excel) |
| Series | 数据列 = 一维数组(DataFrame 的一列) |
| Index | 索引 = 每行的标签(类似行号) |
| GroupBy | 分组 = 按某列分组后聚合(如按性别统计均值) |
| Merge | 合并 = 类似 SQL 的 JOIN(按共同列连接两张表) |
安装配置¶
pip install pandas pyarrow # Pandas 3.0 推荐装 pyarrow
python -c "import pandas; print(pandas.__version__)" # 验证(3.0.x)
基本使用¶
import pandas as pd # 导入
# 读取数据
df = pd.read_csv("data.csv") # 读取 CSV
df = pd.read_excel("data.xlsx", sheet_name="Sheet1") # 读取 Excel
df = pd.read_csv("data.tsv", sep="\t") # 读取 TSV
# 查看数据
print(df.head()) # 前 5 行
print(df.info()) # 列类型和缺失值
print(df.describe()) # 数值统计摘要
print(df.shape) # (行数, 列数)
print(df.columns.tolist()) # 列名列表
# 选择数据
df['age'] # 选择一列(Series)
df[['name', 'age']] # 选择多列
df.loc[0:5, 'name':'age'] # 按标签选择
df.iloc[0:5, 0:3] # 按位置选择
# 筛选行
df[df['age'] > 25] # 年龄 > 25
df[(df['age'] > 25) & (df['gender'] == 'M')] # 组合条件
df.query("age > 25 and gender == 'M'") # query 语法
# 排序
df.sort_values('age', ascending=False) # 按年龄降序
df.sort_values(['group', 'score'], ascending=[True, False]) # 多列排序
数据清洗¶
# 缺失值处理
df.isnull().sum() # 每列缺失值数量
df.dropna() # 删除有缺失的行
df.fillna(0) # 用 0 填充
df['age'].fillna(df['age'].median(), inplace=True) # 用中位数填充
# 去重
df.drop_duplicates() # 删除重复行
df.drop_duplicates(subset=['name']) # 按名字去重
# 类型转换
df['age'] = df['age'].astype(int) # 转整数
df['date'] = pd.to_datetime(df['date']) # 转日期
分组聚合¶
# GroupBy 分组
grouped = df.groupby('group')['score'] # 按组分组
print(grouped.mean()) # 每组均值
print(grouped.agg(['mean', 'std', 'count'])) # 多个统计量
# 数据透视表
pd.pivot_table(df, values='score',
index='group', columns='gender',
aggfunc='mean') # 交叉统计
高级用法¶
合并数据¶
# Merge(类似 SQL JOIN)
merged = pd.merge(df1, df2, on='id', how='left') # 左连接
merged = pd.merge(df1, df2, on='id', how='inner') # 内连接
# Concat(上下拼接)
combined = pd.concat([df1, df2], ignore_index=True) # 纵向拼接
Apply 自定义函数¶
# 对每行/列应用函数
df['bmi'] = df.apply(
lambda row: row['weight'] / (row['height'] / 100) ** 2,
axis=1 # axis=1 按行
)
# 对列应用
df['name_upper'] = df['name'].apply(str.upper) # 名字转大写
保存数据¶
df.to_csv("output.csv", index=False) # 保存 CSV
df.to_excel("output.xlsx", index=False) # 保存 Excel
df.to_parquet("output.parquet") # 保存 Parquet(推荐大数据)
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
KeyError | 列名不存在 | 用 df.columns 检查列名 |
SettingWithCopyWarning | 链式赋值 | 用 .loc[] 或 .copy() |
MemoryError | 数据太大 | 用 chunksize 分块读取 |
ParserError | CSV 格式错误 | 检查分隔符和编码 |
速查表¶
# === 读写 ===
pd.read_csv/excel/parquet/json() # 读取
df.to_csv/excel/parquet/json() # 保存
# === 选择 ===
df['col'] # 一列
df[['c1','c2']] # 多列
df.loc[行标签, 列标签] # 按标签
df.iloc[行号, 列号] # 按位置
# === 清洗 ===
df.dropna() / df.fillna(v) # 缺失值
df.drop_duplicates() # 去重
df.astype(type) # 类型转换
# === 分析 ===
df.groupby('col').agg(func) # 分组聚合
pd.merge(df1, df2, on='key') # 合并
df.value_counts() # 频次统计
参考:Pandas 文档 | 最新版 3.0.3 (2026.05) | 更新于 2026 年