Pandas 是 Python 最流行的数据处理库,专为结构化数据(如表格、时间序列)设计,核心是 DataFrame
和 Series
对象。它基于 NumPy 构建,提供高效的数据操作、清洗和分析功能,广泛应用于数据科学和金融分析。
核心原理
- 数据结构
Series
:一维带标签数组(类似字典),存储单列数据。DataFrame
:二维表格结构(类似 Excel 表格),由多个Series
组成,每列可不同数据类型。
- 底层依赖
- 基于 NumPy 的
ndarray
,但支持异构数据(列类型不同)。 - 使用**索引(Index)**快速定位数据,避免逐行扫描。
- 基于 NumPy 的
- 数据对齐
- 操作(如加法)自动按标签对齐数据,无需手动匹配行列。
基础用法
import pandas as pd
# 1. 创建 DataFrame
data = {
"Name": ["Alice", "Bob", "Charlie"],
"Age": [25, 30, 35],
"City": ["New York", "Paris", "London"]
}
df = pd.DataFrame(data)
print(df)
'''
Name Age City
0 Alice 25 New York
1 Bob 30 Paris
2 Charlie 35 London
'''
# 2. 数据读取与保存
df_csv = pd.read_csv("data.csv") # 读取 CSV
df_excel = pd.read_excel("data.xlsx") # 读取 Excel
df.to_csv("output.csv", index=False) # 保存 CSV(不保留行索引)
# 3. 查看数据
print(df.head(2)) # 前两行
print(df.describe()) # 统计摘要(均值、标准差等)
print(df.info()) # 数据类型和内存信息
数据操作
# 1. 列选择与增删
df["Salary"] = [5000, 6000, 7000] # 新增列
age_series = df["Age"] # 选择列 → Series
df.drop("City", axis=1, inplace=True) # 删除列(axis=1)
# 2. 行筛选(布尔索引)
young_people = df[df["Age"] < 30] # 年龄 <30 的行
name_contains_A = df[df["Name"].str.contains("A")]
# 3. 索引与切片
print(df.loc[0, "Name"]) # Alice → 按标签选择
print(df.iloc[0, 1]) # 25 → 按位置选择
subset = df.loc[0:1, ["Name", "Age"]] # 选择前两行两列
# 4. 排序与去重
df_sorted = df.sort_values("Age", ascending=False) # 按年龄降序
df_unique = df.drop_duplicates(subset=["City"]) # 去重城市列
数据处理
# 1. 缺失值处理
df["Salary"] = [5000, None, 7000] # 故意添加缺失值
df_filled = df.fillna(0) # 用 0 填充缺失值
df_dropped = df.dropna() # 删除含缺失值的行
# 2. 分组聚合
grouped = df.groupby("City") # 按城市分组
print(grouped["Age"].mean()) # 各城市平均年龄
print(df.groupby("City").agg({"Age": "mean", "Salary": "sum"})) # 多列聚合
# 3. 数据合并
df2 = pd.DataFrame({"Name": ["Bob", "David"], "Department": ["IT", "HR"]})
merged = pd.merge(df, df2, on="Name", how="left") # 左连接合并
时间序列处理
# 1. 时间索引
dates = pd.date_range("2023-01-01", periods=3)
time_series = pd.Series([10, 20, 30], index=dates)
print(time_series["2023-01"]) # 筛选 2023 年 1 月数据
# 2. 重采样(降频/升频)
monthly_data = time_series.resample("M").mean() # 按月度平均
# 3. 滑动窗口
rolling_avg = time_series.rolling(window=2).mean() # 滑动平均
实际应用场景
示例1:数据清洗
# 处理异常值:将年龄超过 100 的设为 NaN
df["Age"] = df["Age"].where(df["Age"] <= 100, np.nan)
示例2:复杂筛选与计算
# 计算每个城市薪资最高的员工
max_salary_idx = df.groupby("City")["Salary"].idxmax()
result = df.loc[max_salary_idx]
示例3:数据透视表
# 生成城市 vs 年龄段的交叉统计表
df["AgeGroup"] = pd.cut(df["Age"], bins=[0, 30, 40, 50])
pivot_table = pd.pivot_table(df, values="Salary", index="City", columns="AgeGroup", aggfunc="mean")
性能优化技巧
- 避免逐行操作:使用向量化方法(如
df["col"] * 2
)替代apply
。 - 优化数据类型:将字符串列转为
category
类型节省内存。 - 使用
query
方法:高效筛选大数据集(如df.query("Age > 30 & Salary < 8000")
)。
总结
Pandas 的核心是通过 DataFrame
和 Series
提供灵活的数据操作接口,适用于:
- 数据清洗与预处理(处理缺失值、重复值)
- 统计分析(聚合、分组、透视表)
- 时间序列分析(重采样、滑动窗口)
- 与其他库集成(如 Matplotlib 绘图、Scikit-learn 机器学习)
掌握 groupby
、merge
、pivot_table
等核心方法,能够显著提升数据处理效率。结合 NumPy 和可视化库(如 Seaborn),可构建完整的数据分析工作流。