6·基础入门入门

Pandas 基础:DataFrame 与数据操作

pandaspython

第 6 课 - Pandas 基础:DataFrame 与数据操作

学习目标

完成本课学习后,你将能够:

  1. 理解 Pandas 的核心数据结构:DataFrame 和 Series。
  2. 掌握创建 DataFrame 和从常见文件(如 CSV)中读取数据的方法。
  3. 熟练使用 Pandas 进行数据的选择、过滤和切片操作。
  4. 学会处理数据中的缺失值(NaN),进行基础的数据清洗。
  5. 掌握对 DataFrame 列进行简单计算和新增列的操作。

核心概念

1. 什么是 Pandas 和 DataFrame?

如果把 Python 的 list 比作一个购物清单,NumPy 的数组比作一个整齐的数字方阵,那么 Pandas 的 DataFrame 就像你电脑里的 Excel 表格。它是一个二维的、表格型的数据结构,每一列可以是不同的数据类型(如数字、字符串、布尔值),并且拥有清晰的行标签(索引)和列标签(列名)。

它是数据科学领域进行数据清洗、探索和预处理的核心工具。Pandas 建立在 NumPy 之上,因此可以无缝地进行高效计算。

2. DataFrame 的核心组件

  • 数据(Data):表格中的实际数值。
  • 索引(Index):每一行的标签,默认是 0, 1, 2...,但可以自定义。
  • 列(Columns):每一列的名称,代表一个特征或变量。

一个 DataFrame 可以看作是由多个 Series(一维的、带标签的数组)按列组合而成的。

3. 核心操作流程

我们通常按这个顺序处理数据: 创建/读取 -> 查看与探索 -> 选择与过滤 -> 清洗 -> 计算 -> 输出

代码示例

以下是一个完整的、可运行的示例,演示了从创建数据到进行基本操作的全过程。

import pandas as pd
import numpy as np

# ============================
# 1. 创建 DataFrame
# ============================
# 方法一:通过字典创建。字典的键是列名,值是列数据列表。
data = {
    ‘姓名‘: [‘张三‘, ‘李四‘, ‘王五‘, ‘赵六‘],
    ‘年龄‘: [25, 30, 35, 28],
    ‘城市‘: [‘北京‘, ‘上海‘, ‘广州‘, ‘北京‘],
    ‘年薪‘: [150000, 200000, 180000, 120000]
}
df = pd.DataFrame(data)
print(“=== 原始 DataFrame ===“)
print(df)
print(f“\n数据类型:\n{df.dtypes}“) # 查看各列数据类型

# ============================
# 2. 从 CSV 文件读取(模拟)
# ============================
# 在实际中,你通常会从文件读取。
# 假设有一个 `employees.csv` 文件,内容与上面字典数据相同。
# df = pd.read_csv(‘employees.csv‘)

# ============================
# 3. 数据选择与过滤
# ============================
# 选择单列(返回一个 Series)
print(“\n=== 选择单列:姓名 ===“)
print(df[‘姓名‘])

# 选择多列(返回一个新的 DataFrame)
print(“\n=== 选择多列:姓名 和 城市 ===“)
print(df[[‘姓名‘, ‘城市‘]])

# 使用 loc(基于标签选择)和 iloc(基于位置选择)
print(“\n=== loc: 选择索引为1的行,‘姓名‘ 和 ‘城市‘ 列 ===“)
print(df.loc[1, [‘姓名‘, ‘城市‘]])

print(“\n=== iloc: 选择前两行,所有列 ===“)
print(df.iloc[:2, :])

# 条件过滤:找出年龄大于28岁的人
print(“\n=== 条件过滤:年龄 > 28 ===“)
print(df[df[‘年龄‘] > 28])

# 组合条件:北京且年薪 > 13万 (注意用 & 和括号)
print(“\n=== 组合条件:北京且年薪 > 130000 ===“)
print(df[(df[‘城市‘] == ‘北京‘) & (df[‘年薪‘] > 130000)])

# ============================
# 4. 数据清洗:处理缺失值
# ============================
# 制造一些缺失值
df.loc[2, ‘年龄‘] = np.nan  # 将王五的年龄设为缺失
df.loc[3, ‘年薪‘] = np.nan  # 将赵六的年薪设为缺失
print(“\n=== 包含缺失值的 DataFrame ===“)
print(df)

# 查看缺失值情况
print(f“\n各列缺失值数量:\n{df.isnull().sum()}“)

# 处理缺失值:方式一,删除含有缺失值的行
df_dropped = df.dropna()
print(“\n=== 删除缺失值后的 DataFrame ===“)
print(df_dropped)

# 处理缺失值:方式二,用特定值填充(例如用0或平均值)
df_filled = df.copy() # 创建副本,避免修改原数据
df_filled[‘年龄‘] = df_filled[‘年龄‘].fillna(df_filled[‘年龄‘].mean()) # 用平均年龄填充
df_filled[‘年薪‘] = df_filled[‘年薪‘].fillna(0) # 用0填充年薪
print(“\n=== 填充缺失值后的 DataFrame ===“)
print(df_filled)

# ============================
# 5. 数据计算与新增列
# ============================
# 对列进行向量化计算
df_filled[‘月薪‘] = df_filled[‘年薪‘] / 12  # 新增‘月薪‘列
print(“\n=== 新增‘月薪‘列后的 DataFrame ===“)
print(df_filled)

# 使用 apply 函数进行更复杂的计算(例如,对姓名列应用一个函数)
df_filled[‘姓名长度‘] = df_filled[‘姓名‘].apply(lambda x: len(x))
print(“\n=== 新增‘姓名长度‘列 ===“)
print(df_filled)

# 基础聚合统计
print(f“\n平均年龄: {df_filled[‘年龄‘].mean():.2f}“)
print(f“最高年薪: {df_filled[‘年薪‘].max()}“)
print(f“人数统计(按城市):\n{df_filled[‘城市‘].value_counts()}“)

实践练习

练习 1:基础创建与查看

创建一个包含以下信息的 DataFrame:

产品名价格库存量类别
Python书59.9100书籍
机械键盘29950外设
显示器159930电脑配件
鼠标99200外设
  1. 打印该 DataFrame。
  2. 显示其数据类型。
  3. 打印出“类别”这一列。

练习 2:文件读取与选择

假设你有一个名为 sales.csv 的文件,其前三行数据如下:

订单号,产品,数量,单价,总价
1001,苹果,5,3.0,15.0
1002,香蕉,3,2.5,7.5
1003,苹果,2,3.0,6.0
  1. 用 Pandas 读取这个 CSV 文件。
  2. 选择并打印出“产品”和“总价”两列。
  3. 筛选出所有“产品”是“苹果”的记录。

练习 3:数据清洗与计算

继续使用练习 1 创建的 DataFrame。

  1. 人为将“显示器”的“价格”和“键盘”的“库存量”设置为缺失值(np.nan)。
  2. 用该列的平均值分别填充“价格”和“库存量”的缺失值。
  3. 计算并新增一列“库存总价值”(价格 * 库存量)。

常见错误

  1. 索引混淆:使用 df[0] 尝试选择第一行会报错(因为 Pandas 默认将括号 [] 用于选择列)。选择行应该用 .loc[].iloc[]

    # 错误!
    # first_row = df[0]
    # 正确!
    first_row = df.iloc[0]
    
  2. 数据类型不匹配:在进行比较或计算时,确保列的数据类型正确。例如,从 CSV 读入的数字列可能是字符串 object 类型,需要用 pd.to_numeric() 转换。

    # 假设 df[‘价格‘] 是字符串类型 ‘59.9‘
    # df[‘价格‘] > 100  # 这会出错!
    # 应该先转换类型
    df[‘价格‘] = pd.to_numeric(df[‘价格‘])
    
  3. 链式赋值警告(Chained Assignment):不要直接在切片或条件选择的结果上赋值,这可能会产生 SettingWithCopyWarning,且不一定能修改原数据。推荐使用 .loc[] 明确索引进行赋值。

    # 不推荐的做法(可能产生警告,且行为不确定)
    df[df[‘年龄‘] > 28][‘备注‘] = ‘资深‘
    # 推荐的做法
    df.loc[df[‘年龄‘] > 28, ‘备注‘] = ‘资深‘
    

小结

在本课中,我们迈出了数据科学实践中至关重要的一步:

  • Pandas 的 DataFrame 是处理表格数据的核心,它由行索引、列名和数据构成。
  • 我们可以通过字典或读取 CSV 等文件来创建 DataFrame。
  • 数据选择是基础操作,包括选择列(df[‘col‘])、按标签选择(loc)、按位置选择(iloc)以及布尔条件过滤。
  • 处理缺失值是数据清洗的第一课,主要方法是删除(dropna)或填充(fillna)。
  • 在 DataFrame 上,我们可以轻松地进行列间计算、新增列和聚合统计

掌握 Pandas 将使你能够高效地“摆弄”任何表格数据,为后续的机器学习建模打下坚实的数据基础。下一课,我们将学习如何将处理好的数据用图表展示出来,即 Matplotlib 可视化入门。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「Matplotlib 基础:数据可视化入门」 以巩固所学知识。