3. 数据加载与初探:使用 pandas 读取 CSV/Excel、查看数据形状、数据类型、缺失值概览

在催收触达异常波动的复盘分析中,第一步是将原始数据从文件系统加载到 Python 工作环境。本章将演示如何使用 pandas 库读取 CSV 和 Excel 文件,并快速掌握数据集的整体面貌,包括行数列数、各字段的数据类型以及缺失值的分布情况。这是后续所有清洗、统计与建模工作的基础。

3.1 数据加载:从文件到 DataFrame

pandas 提供了 read_csv() 和 read_excel() 两个核心函数。实际催收数据通常以 CSV 格式存储,但部分业务系统也会导出 Excel 文件。以下代码展示了两种加载方式:

import pandas as pd

# 读取 CSV 文件(默认编码为 utf-8,若含中文可指定 encoding='gbk')
df_csv = pd.read_csv('collection_contact_log.csv', encoding='utf-8')

# 读取 Excel 文件(需安装 openpyxl 或 xlrd 引擎)
df_excel = pd.read_excel('collection_contact_log.xlsx', sheet_name='Sheet1')
编码避坑: 催收数据常包含中文姓名、备注等字段,若 CSV 文件由 Windows 系统生成,编码通常为 gbk 或 gb2312。遇到 UnicodeDecodeError 时,尝试 encoding='gbk' 或 encoding='gb18030'。

3.2 数据形状:快速了解行列规模

使用 .shape 属性可以立即获得 DataFrame 的行数和列数,这是判断数据量级和后续处理复杂度的第一指标。

print(f"数据集形状(行, 列): {df.shape}")
# 输出示例:数据集形状(行, 列): (158432, 12)

对于催收触达数据,常见的行数范围从数万到数百万不等。列数通常包含以下关键字段:

字段类别 典型字段名 说明
案件标识 case_id, account_id 唯一案件编号
触达时间 contact_time, call_time 催收动作发生时间
触达方式 contact_channel 电话、短信、AI 外呼等
触达结果 contact_result 接通、未接通、拒绝等
催收员 collector_id 执行催收的员工编号
案件金额 amount_due 逾期本金或总欠款

3.3 数据类型:识别字段的存储格式

.dtypes 属性可以列出每一列的数据类型。催收数据中常见的 dtype 包括 int64、float64、object(通常为字符串)、datetime64 等。检查数据类型有助于发现字段格式错误,例如时间列被误读为字符串。

print(df.dtypes)
# 输出示例:
# case_id            int64
# contact_time      object   # 注意:时间列被读成了字符串
# contact_channel   object
# contact_result    object
# amount_due       float64
# dtype: object
常见问题: 时间字段 contact_time 显示为 object 而非 datetime64,说明需要手动转换。使用 pd.to_datetime() 进行格式统一,否则后续按时间聚合或排序会出错。

3.4 缺失值概览:发现数据空洞

缺失值在催收数据中非常普遍,例如未接通电话没有通话时长、部分案件缺少催收员编号等。使用 .isnull() 结合 .sum() 可以快速统计每列的缺失数量。

missing_count = df.isnull().sum()
missing_ratio = df.isnull().mean() * 100

missing_summary = pd.DataFrame({
    '缺失数量': missing_count,
    '缺失比例(%)': missing_ratio.round(2)
})
print(missing_summary[missing_summary['缺失数量'] > 0])

输出示例:

字段 缺失数量 缺失比例(%)
call_duration 12,345 7.79
collector_id 2,100 1.33
contact_result 890 0.56

缺失比例超过 5% 的字段需要重点关注,可能影响后续的触达率计算和异常检测。

3.5 数据加载与初探流程总览

下面的 SVG 图展示了从原始文件到初步数据洞察的完整流程,包含加载、形状检查、类型识别和缺失值统计四个关键步骤。

数据加载与初探流程 CSV/Excel read_csv() DataFrame .shape .dtypes .isnull() 行数列数 字段类型表 缺失统计 数据加载 → 形状检查 → 类型识别 → 缺失值统计,四步完成初探

3.6 综合初探:一行代码掌握全局

pandas 的 .info() 方法可以一次性输出数据形状、每列数据类型和非空数量,是初探阶段最实用的综合命令:

df.info()
# 输出示例:
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 158432 entries, 0 to 158431
# Data columns (total 12 columns):
#  #   Column           Non-Null Count   Dtype
# ---  ------           --------------   -----
#  0   case_id          158432 non-null  int64
#  1   contact_time     158432 non-null  object
#  2   contact_channel  158432 non-null  object
#  3   contact_result   157542 non-null  object
#  4   call_duration    146087 non-null  float64
#  5   collector_id     156332 non-null  object
#  6   amount_due       158432 non-null  float64
#  7   ...              ...              ...
# dtypes: float64(2), int64(1), object(9)
# memory usage: 14.5+ MB
复盘要点: 通过 .info() 可以快速发现:
• 总记录数 158,432 条,12 个字段。
• contact_time 为 object 类型,需转为 datetime。
• call_duration 缺失约 12,345 条,占比 7.79%,需评估是否填充或剔除。
• 内存占用约 14.5 MB,数据量适中,适合在单机环境分析。

完成数据加载与初探后,我们已经掌握了数据集的基本骨架。接下来将进入数据清洗与预处理环节,处理缺失值、异常值和格式问题,为后续的触达异常波动分析铺平道路。