3. Pandas 基础回顾:DataFrame 与 Series 创建、数据读取、预览与类型转换
数据质量检查的第一步,是熟练使用 Pandas 加载、预览和理解数据。本章将系统回顾 Pandas 最核心的基础操作,包括两种核心数据结构(Series 与 DataFrame)的创建、多种格式文件的读取、数据预览方法以及数据类型的管理与转换。这些操作是后续所有数据质量检查脚本的基石。
3.1 核心数据结构:Series 与 DataFrame
Pandas 建立在两种核心数据结构之上:Series(一维带标签数组)和 DataFrame(二维带标签表格)。理解它们的创建方式是所有后续操作的前提。
3.1.1 Series 创建
Series 可以从列表、字典或标量值创建。每个 Series 都包含 index(索引)和 values(值)两个属性。
import pandas as pd
# 从列表创建,默认整数索引
s1 = pd.Series([10, 20, 30, 40, 50])
print(s1)
# 从字典创建,键自动成为索引
s2 = pd.Series({'a': 100, 'b': 200, 'c': 300})
print(s2)
# 指定自定义索引
s3 = pd.Series([1.5, 2.5, 3.5], index=['x', 'y', 'z'])
print(s3)
3.1.2 DataFrame 创建
DataFrame 是最常用的数据结构,可以从字典、列表、NumPy 数组或嵌套字典创建。
import pandas as pd
# 从字典创建(键为列名,值为列数据)
df1 = pd.DataFrame({
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'城市': ['北京', '上海', '广州']
})
print(df1)
# 从列表嵌套创建
df2 = pd.DataFrame([
['A001', '产品X', 1200.0],
['A002', '产品Y', 850.5],
['A003', '产品Z', 2100.0]
], columns=['订单号', '产品名', '金额'])
print(df2)
💡 实践要点:在数据质量检查脚本中,DataFrame 是承载原始数据的主要容器。创建时建议明确指定
dtype 参数,避免 Pandas 自动推断类型导致后续检查偏差。
3.2 数据读取:CSV / Excel / JSON
实际工作中,数据通常以文件形式存在。Pandas 提供了统一的读取接口,支持多种格式。下表总结了最常用的三种读取方式及其关键参数。
| 文件格式 | 读取函数 | 常用参数 | 典型场景 |
|---|---|---|---|
| CSV | pd.read_csv() |
filepath, sep, encoding, header, na_values |
系统导出、日志文件、标准表格数据 |
| Excel | pd.read_excel() |
filepath, sheet_name, header, dtype |
业务报表、手工维护的数据集 |
| JSON | pd.read_json() |
filepath, orient, lines |
API 接口返回、NoSQL 导出、嵌套结构数据 |
import pandas as pd
# 读取 CSV 文件(指定编码和分隔符)
df_csv = pd.read_csv('sales_data.csv', encoding='utf-8', sep=',')
# 读取 Excel 文件(指定工作表)
df_excel = pd.read_excel('inventory.xlsx', sheet_name='Sheet1')
# 读取 JSON 文件(按行读取)
df_json = pd.read_json('api_response.json', orient='records')
⚠️ 常见陷阱:读取 CSV 时,
encoding 参数容易被忽略。中文数据常使用 utf-8 或 gbk,编码错误会导致乱码或读取失败。建议在读取后立即检查 df.columns 确认列名是否正常。
3.3 数据预览:head / info / describe
数据加载完成后,必须进行快速预览,以初步了解数据规模、列结构、缺失情况和统计分布。这三个方法是数据质量检查的“第一道防线”。
df.head(n):查看前 n 行(默认 5 行),快速确认数据格式和列名是否正确。df.info():打印 DataFrame 的摘要信息,包括行数、列数、每列的非空计数和数据类型。df.describe():生成数值型列的统计摘要(计数、均值、标准差、四分位数等)。
import pandas as pd
# 示例数据
df = pd.DataFrame({
'订单ID': ['ORD001', 'ORD002', 'ORD003', 'ORD004'],
'金额': [150.0, 200.5, None, 320.0],
'数量': [2, 3, 1, 5],
'日期': ['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04']
})
# 预览前 3 行
print(df.head(3))
# 查看数据信息
print(df.info())
# 查看统计摘要
print(df.describe())
📌 质量检查要点:通过
info() 可以快速发现缺失值(非空计数 < 总行数);通过 describe() 可以识别异常值(如金额为负数、数量超出合理范围)。这是数据质量检查脚本的起点。
3.4 数据类型查看与转换
数据类型是数据质量的核心维度之一。错误的类型会导致后续计算、筛选和可视化全部出错。Pandas 使用 dtypes 属性查看类型,使用 astype() 和 pd.to_datetime() / pd.to_numeric() 进行转换。
3.4.1 查看数据类型
# 查看所有列的数据类型
print(df.dtypes)
# 查看单列类型
print(df['金额'].dtype)
3.4.2 数据类型转换
| 目标类型 | 转换方法 | 示例 |
|---|---|---|
| 数值型 | pd.to_numeric() |
df['金额'] = pd.to_numeric(df['金额'], errors='coerce') |
| 日期型 | pd.to_datetime() |
df['日期'] = pd.to_datetime(df['日期'], format='%Y-%m-%d') |
| 字符串 | .astype(str) |
df['订单ID'] = df['订单ID'].astype(str) |
| 分类型 | .astype('category') |
df['城市'] = df['城市'].astype('category') |
import pandas as pd
# 示例:类型转换
df = pd.DataFrame({
'金额': ['150.0', '200.5', 'abc', '320.0'], # 含非数值
'日期': ['2024-01-01', '2024/01/02', '2024-01-03', '2024-01-04'] # 格式不统一
})
# 转换为数值,无效值变为 NaN
df['金额'] = pd.to_numeric(df['金额'], errors='coerce')
# 转换为日期,自动推断格式
df['日期'] = pd.to_datetime(df['日期'], errors='coerce')
print(df.dtypes)
print(df)
💡 最佳实践:在数据质量检查脚本中,建议在数据加载后立即执行类型检查与转换。使用
errors='coerce' 参数可以将无法转换的值置为 NaN,便于后续统一处理缺失值,而不是让脚本崩溃。