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) |
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=['姓名', '年龄', '部门'])
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: 对分类变量,检查是否有异常类别或分布严重不均。
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()}")
- 先预览,后分析: 不要直接对数据做复杂操作,先用
head()和info()了解数据全貌。 - 记录基线: 在清洗前记录原始数据的行数、列数、缺失值数量,以便评估清洗效果。
- 关注数据类型: 数值列被读为字符串是常见问题,尽早发现并修正。
- 使用 describe() 发现异常: 关注 min 和 max 是否在合理范围内,mean 和 median 是否接近。
3.5 本章小结
本章系统学习了 Pandas 数据加载与预览的核心技能:
- Series 与 DataFrame: 理解两种数据结构的区别与创建方法。
- 数据读取: 掌握 CSV、Excel、JSON 文件的读取参数与常见问题处理。
- 数据预览: 熟练使用
head()、info()、describe()快速评估数据质量。 - 综合流程: 建立从加载到初步质量检查的标准化操作流程。