Pandas原理与用法详解

Pandas 是 Python 最流行的数据处理库,专为结构化数据(如表格、时间序列)设计,核心是 DataFrameSeries 对象。它基于 NumPy 构建,提供高效的数据操作、清洗和分析功能,广泛应用于数据科学和金融分析。


核心原理
  1. 数据结构
    • Series:一维带标签数组(类似字典),存储单列数据。
    • DataFrame:二维表格结构(类似 Excel 表格),由多个 Series 组成,每列可不同数据类型。
  2. 底层依赖
    • 基于 NumPy 的 ndarray,但支持异构数据(列类型不同)。
    • 使用**索引(Index)**快速定位数据,避免逐行扫描。
  3. 数据对齐
    • 操作(如加法)自动按标签对齐数据,无需手动匹配行列。

基础用法
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")

性能优化技巧
  1. 避免逐行操作:使用向量化方法(如 df["col"] * 2)替代 apply
  2. 优化数据类型:将字符串列转为 category 类型节省内存。
  3. 使用 query 方法:高效筛选大数据集(如 df.query("Age > 30 & Salary < 8000"))。

总结

Pandas 的核心是通过 DataFrameSeries 提供灵活的数据操作接口,适用于:

  • 数据清洗与预处理(处理缺失值、重复值)
  • 统计分析(聚合、分组、透视表)
  • 时间序列分析(重采样、滑动窗口)
  • 与其他库集成(如 Matplotlib 绘图、Scikit-learn 机器学习)

掌握 groupbymergepivot_table 等核心方法,能够显著提升数据处理效率。结合 NumPy 和可视化库(如 Seaborn),可构建完整的数据分析工作流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值