一、CFPS 数据简介
CFPS(China Family Panel Studies)由北京大学社会科学调查中心发起,自2010 年起每两年进行一次全国性纵向跟踪调查,覆盖个人、家庭及社区层面,旨在反映中国经济、教育、健康、家庭等多维社会状况
抽样方式:采用分层多阶段概率抽样,保障样本可代表全国大约 25 个省份
数据结构:多个子数据集对应不同专题,如个人年龄、收入、教育、健康等,结构复杂,变量命名冗长且随波次变化。
常用变量:包括基本人口变量(如 age、gender)、家庭变量(如 household income)、社区变量(如社区医疗设施)等。
若想用 Python 高效处理 CFPS 数据,第一步是熟悉其波次结构、变量命名与权重使用,避免合并和清洗时出错。
二、数据清理原理
1. 数据清理流程与核心原则
加载阶段:用 pandas.read_sas() 或 pd.read_csv() 加载原始文件,结合 codebook 读取对应变量。
变量标准化:统一命名风格(如去掉后缀、调整小写),方便代码引用。
处理缺失值:判断是完全缺失(NA)、合法缺失(如 “拒答”),再决定填充策略:
数值类型:用中位数或均值填充;
类别类型:用出现频率最高者填充;
异常值(如年龄 > 120 或收入 < 0)设置为 NaN。
重复数据排查:尤为双层数据(家庭层 + 个人层)合并后,需要用主键 person_id + wave 判断重复条目。
变量类型转换:确保分类变量转换为 category,时间变量可解析为 datetime。
2. AI 加速工作流程
通过 deepseek 等语言模型可辅助:
自动读取 codebook 并生成变量重命名表;
推荐缺失值处理逻辑;
帮助定位“merge 重复值”来源,协助 debug。
三、Python 清理代码示例
import pandas as pd
import numpy as np
def load_cfps(path):
return pd.read_sas(path, format='sas7bdat', encoding='utf-8')
# 加载示例数据
df = load_cfps('CFPS2018_individual.sas7bdat')
# 变量重命名 demo(借助 AI 或 codebook)
columns = {
'RESPID': 'person_id',
'AGE': 'age',
'GENDER': 'gender',
'HHDI': 'hh_income',
}
df.rename(columns=columns, inplace=True)
# 缺失值处理
df['age'] = df['age'].replace([-97, -98, -99], np.nan)
df['age'].fillna(df['age'].median(), inplace=True)
# 异常值排查
mask = (df['hh_income'] < 0) | (df['hh_income'] > 1e7)
df.loc[mask, 'hh_income'] = np.nan
# 重复记录检测
dupes = df.duplicated(subset=['person_id', 'wave'], keep=False)
if dupes.any():
print(f"发现 {dupes.sum()} 条重复记录,需进一步合并或剔除")
# 格式转换
df['gender'] = df['gender'].map({1:'男', 2:'女'}).astype('category')
# 将清洗函数封装
def clean_cfps(df):
df = df.rename(columns=columns)
df['age'].replace([-97,-98,-99], np.nan, inplace=True)
df['age'].fillna(df['age'].median(), inplace=True)
mask = (df['hh_income']<0)|(df['hh_income']>1e7)
df.loc[mask, 'hh_income'] = np.nan
df['gender'] = df['gender'].map({1:'男',2:'女'}).astype('category')
return df
df_clean = clean_cfps(df)
df_clean.to_csv('CFPS2018_cleaned.csv', index=False)
以上结构清晰的处理流程与标准化代码设计,有效应对 CFPS 数据的变量命名混乱、缺失值处理、重复值识别等常见痛点。可结合 AI 实现变量批量重命名、异常模式识别,辅助定位 merge 重复错误、提升处理效率。
如需进一步扩展至跨波次合并、面板数据构造、时间效应分割变量生成、merge 后样本完整性检测等高级内容,欢迎继续交流!