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')
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 图展示了从原始文件到初步数据洞察的完整流程,包含加载、形状检查、类型识别和缺失值统计四个关键步骤。
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,数据量适中,适合在单机环境分析。
完成数据加载与初探后,我们已经掌握了数据集的基本骨架。接下来将进入数据清洗与预处理环节,处理缺失值、异常值和格式问题,为后续的触达异常波动分析铺平道路。