3. Pandas 基础:Series 与 DataFrame 创建、数据读取与预览

数据质量检查的第一步,是将数据加载到 Python 环境中。Pandas 库提供了两种核心数据结构——Series(一维序列)和 DataFrame(二维表格),以及丰富的文件读取与预览方法。本章将系统讲解这些基础操作,为后续的数据质量评估打下坚实基础。

3.1 核心数据结构:Series 与 DataFrame

Pandas 的所有数据操作都围绕两种数据结构展开。理解它们的区别与适用场景,是高效使用 Pandas 的前提。

特性 Series DataFrame
维度 一维(类似带标签的数组) 二维(类似电子表格或 SQL 表)
组成 索引(index)+ 数据(values) 行索引 + 列索引 + 数据
数据类型 单列,通常为同一种数据类型 每列可拥有不同的数据类型
典型用途 存储单个字段、时间序列 存储多字段结构化数据
创建方式 pd.Series(data) pd.DataFrame(data)
数据质量视角: 在检查数据质量时,DataFrame 是主要操作对象,因为它能完整呈现字段间的关联关系。Series 则常用于提取单个字段进行独立分析,如检查某列的缺失值比例或异常值分布。

3.1.1 创建 Series

Series 可以从列表、字典或标量值创建。索引默认为从 0 开始的整数,也可以自定义。

import pandas as pd

# 从列表创建
s1 = pd.Series([85, 92, 78, 95, 88])
print(s1)
# 输出:
# 0    85
# 1    92
# 2    78
# 3    95
# 4    88
# dtype: int64

# 从字典创建(键自动成为索引)
s2 = pd.Series({'张三': 85, '李四': 92, '王五': 78})
print(s2)
# 输出:
# 张三    85
# 李四    92
# 王五    78
# dtype: int64

# 指定索引创建
s3 = pd.Series([85, 92, 78], index=['A001', 'A002', 'A003'])
print(s3)
# 输出:
# A001    85
# A002    92
# A003    78
# dtype: int64

3.1.2 创建 DataFrame

DataFrame 是最常用的数据结构,可以通过字典、列表、NumPy 数组或读取文件创建。

# 从字典创建(键为列名,值为列数据)
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [28, 34, 29, 42],
    '部门': ['技术部', '市场部', '技术部', '财务部'],
    '薪资': [15000, 18000, 16000, 21000]
}
df = pd.DataFrame(data)
print(df)
# 输出:
#    姓名  年龄  部门    薪资
# 0  张三  28  技术部  15000
# 1  李四  34  市场部  18000
# 2  王五  29  技术部  16000
# 3  赵六  42  财务部  21000

# 从列表嵌套列表创建(需指定列名)
df2 = pd.DataFrame([
    ['张三', 28, '技术部'],
    ['李四', 34, '市场部']
], columns=['姓名', '年龄', '部门'])
数据质量检查要点: 创建 DataFrame 时,注意检查列名是否一致、数据类型是否预期。例如,如果“年龄”列意外出现了字符串,后续的数值计算将报错。
Pandas 核心数据结构关系 Series(一维序列) 索引(index) 数据(values) DataFrame(二维表格) 行索引 + 列索引 多列数据(每列可不同 dtype) 多列组合 DataFrame 本质上是 Series 的容器 每一列都是一个 Series,共享同一个行索引 数据质量检查时,常逐列(Series)分析,整体(DataFrame)评估

3.2 数据读取:从文件到 DataFrame

实际工作中,数据通常存储在文件中。Pandas 提供了 read_csv()、read_excel()、read_json() 等函数,一键将文件加载为 DataFrame。

3.2.1 读取 CSV 文件

CSV 是最通用的数据交换格式。读取时需注意分隔符、编码、表头等参数。

# 基本读取(默认分隔符为逗号,第一行为列名)
df_csv = pd.read_csv('sales_data.csv')

# 常用参数详解
df_csv = pd.read_csv(
    'sales_data.csv',        # 文件路径
    sep=',',                 # 分隔符(制表符用 '\t')
    encoding='utf-8',        # 编码(常见:utf-8, gbk, latin1)
    header=0,                # 表头所在行(0 表示第一行,None 表示无表头)
    names=['col1','col2'],   # 自定义列名(当 header=None 时使用)
    dtype={'年龄': int},     # 指定列数据类型
    parse_dates=['日期'],    # 自动解析日期列
    na_values=['NA','NULL'], # 将指定值视为缺失值
    nrows=1000               # 只读取前 1000 行(用于快速预览)
)

3.2.2 读取 Excel 文件

Excel 文件可能包含多个工作表,读取时需指定工作表名称或索引。

# 读取第一个工作表
df_excel = pd.read_excel('inventory.xlsx')

# 读取指定工作表
df_sheet2 = pd.read_excel('inventory.xlsx', sheet_name='Sheet2')

# 读取多个工作表(返回字典)
dfs = pd.read_excel('inventory.xlsx', sheet_name=['Sheet1', 'Sheet2'])
df_sheet1 = dfs['Sheet1']

# 指定读取范围
df_range = pd.read_excel('inventory.xlsx', sheet_name='Sheet1',
                         skiprows=2, nrows=500)

3.2.3 读取 JSON 文件

JSON 常用于 API 接口和 NoSQL 数据库。Pandas 支持多种 JSON 结构。

# 读取标准 JSON(记录格式)
df_json = pd.read_json('users.json')

# 读取嵌套 JSON(需指定路径)
df_nested = pd.read_json('nested_data.json', orient='records')

# 从 JSON 字符串读取
import json
json_str = '[{"name":"Alice","age":30},{"name":"Bob","age":25}]'
df_from_str = pd.read_json(json_str)
常见数据读取问题:
  • 编码错误: 出现乱码时,尝试 encoding='gbk' 或 encoding='utf-8-sig'。
  • 分隔符不匹配: CSV 文件实际使用分号或制表符时,需显式指定 sep 参数。
  • 数据类型推断错误: 数值列可能被读为字符串(如“00123”),使用 dtype 参数强制指定。
  • 大文件读取缓慢: 使用 nrows 预览,或 chunksize 分块读取。

3.3 数据预览:快速了解数据全貌

加载数据后,第一件事是预览数据,了解其规模、结构、类型和基本统计信息。Pandas 提供了三个核心方法:head()、info()、describe()。

3.3.1 head():查看前几行

head() 用于快速查看数据样本,默认显示前 5 行。配合 tail() 可查看末尾行。

# 查看前 5 行
print(df.head())
# 输出:
#    姓名  年龄  部门    薪资
# 0  张三  28  技术部  15000
# 1  李四  34  市场部  18000
# 2  王五  29  技术部  16000
# 3  赵六  42  财务部  21000

# 查看前 10 行
print(df.head(10))

# 查看后 3 行
print(df.tail(3))

3.3.2 info():获取数据摘要

info() 是数据质量检查的“第一站”,它一次性展示:行数、列数、每列的非空值数量、数据类型和内存占用。

print(df.info())
# 输出:
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 4 entries, 0 to 3
# Data columns (total 4 columns):
#  #   Column  Non-Null Count  Dtype
# ---  ------  --------------  -----
#  0   姓名      4 non-null      object
#  1   年龄      4 non-null      int64
#  2   部门      4 non-null      object
#  3   薪资      4 non-null      int64
# dtypes: int64(2), object(2)
# memory usage: 256.0+ bytes
数据质量检查要点:
  • 非空值数量: 如果某列的 Non-Null Count 小于总行数,说明存在缺失值。
  • 数据类型: 检查 Dtype 是否符合预期。例如,“年龄”应为 int64 而非 object。
  • 内存占用: 大数据集可据此评估是否需要优化数据类型以节省内存。

3.3.3 describe():统计摘要

describe() 对数值列自动计算常用统计量,对非数值列则显示计数、唯一值、众数等。

# 数值列统计摘要
print(df.describe())
# 输出:
#             年龄          薪资
# count   4.000000      4.000000
# mean   33.250000  17500.000000
# std     6.238322   2738.612788
# min    28.000000  15000.000000
# 25%    28.750000  15750.000000
# 50%    31.500000  17000.000000
# 75%    36.000000  18750.000000
# max    42.000000  21000.000000

# 包含所有列(包括非数值列)
print(df.describe(include='all'))
# 输出:
#         姓名    年龄    部门      薪资
# count     4     4      4       4
# unique    4   NaN      3     NaN
# top     张三   NaN   技术部    NaN
# freq      1   NaN      2     NaN
# mean    NaN  33.25   NaN  17500.0
# std     NaN   6.24   NaN   2738.6
# min     NaN  28.00   NaN  15000.0
# 25%     NaN  28.75   NaN  15750.0
# 50%     NaN  31.50   NaN  17000.0
# 75%     NaN  36.00   NaN  18750.0
# max     NaN  42.00   NaN  21000.0
数据质量检查要点:
  • count: 与总行数对比,快速发现缺失值。
  • min / max: 检查是否存在异常值(如年龄为 200 岁)。
  • mean / std: 判断数据分布是否合理。
  • unique / top / freq: 对分类变量,检查是否有异常类别或分布严重不均。
数据预览三步法:从加载到质量初判 步骤 1:head() 查看前 N 行样本 确认列名、数据格式 步骤 2:info() 行数、列数、非空值 数据类型、内存占用 步骤 3:describe() 统计摘要 均值、极值、分布 数据质量初步检查清单 ✅ head():列名是否清晰?数据格式是否一致?有无明显乱码? ✅ info():是否有缺失值(Non-Null Count < 总行数)?数据类型是否正确? ✅ describe():数值范围是否合理?均值/中位数是否异常?分类变量分布是否均衡? ✅ 综合判断:是否需要进一步清洗(缺失值填充、类型转换、异常值处理)?

3.4 综合示例:完整的数据加载与预览流程

以下示例演示了从 CSV 文件加载数据到完成初步质量检查的完整流程。

import pandas as pd

# 1. 加载数据
df = pd.read_csv('customer_data.csv', encoding='utf-8')

# 2. 查看数据规模
print(f"数据集形状:{df.shape}")  # (行数, 列数)

# 3. 预览前几行
print("前 5 行数据:")
print(df.head())

# 4. 获取数据摘要
print("\n数据摘要:")
print(df.info())

# 5. 统计摘要
print("\n统计摘要:")
print(df.describe(include='all'))

# 6. 快速质量检查
print("\n=== 快速质量检查 ===")
print(f"总行数:{len(df)}")
print(f"总列数:{len(df.columns)}")
print(f"列名:{list(df.columns)}")
print(f"缺失值统计:\n{df.isnull().sum()}")
print(f"重复行数:{df.duplicated().sum()}")
数据质量检查最佳实践:
  1. 先预览,后分析: 不要直接对数据做复杂操作,先用 head() 和 info() 了解数据全貌。
  2. 记录基线: 在清洗前记录原始数据的行数、列数、缺失值数量,以便评估清洗效果。
  3. 关注数据类型: 数值列被读为字符串是常见问题,尽早发现并修正。
  4. 使用 describe() 发现异常: 关注 min 和 max 是否在合理范围内,mean 和 median 是否接近。

3.5 本章小结

本章系统学习了 Pandas 数据加载与预览的核心技能:

  • Series 与 DataFrame: 理解两种数据结构的区别与创建方法。
  • 数据读取: 掌握 CSV、Excel、JSON 文件的读取参数与常见问题处理。
  • 数据预览: 熟练使用 head()、info()、describe() 快速评估数据质量。
  • 综合流程: 建立从加载到初步质量检查的标准化操作流程。