【PythonAI】2.2.3 技能实训:处理缺失值、重复值,进行数据筛选与排序

📅 2026/7/12 23:08:18 👁️ 阅读次数 📝 编程学习
【PythonAI】2.2.3 技能实训:处理缺失值、重复值,进行数据筛选与排序
importpandasaspdimportnumpyasnp# 设置显示选项(统信/麒麟OS终端适配)pd.set_option('display.max_columns',None)pd.set_option('display.width',1000)pd.set_option('display.max_colwidth',50)# 读取CSV文件df=pd.read_csv('dirty_reviews.csv')# 查看基本信息print("数据形状:",df.shape)print("\n前5行数据:")print(df.head())print("\n数据信息:")df.info()print("\n基础统计:")print(df.describe())defdata_quality_report(df):"""生成数据质量报告"""report={'总记录数':len(df),'总列数':len(df.columns),'缺失值统计':df.isnull().sum().to_dict(),'缺失值比例':(df.isnull().sum()/len(df)*100).round(2).to_dict(),'重复行数':df.duplicated().sum(),'数据类型':df.dtypes.to_dict()}print("="*50)print("数据质量评估报告")print("="*50)forkey,valueinreport.items():print(f"\n【{key}】")ifisinstance(value,dict):fork,vinvalue.items():print(f"{k}:{v}")else:print(f"{value}")print("="*50)returnreport# 生成报告quality_report=data_quality_report(df)# 1. 处理重复值print(f"清洗前记录数:{len(df)}")df_clean=df.drop_duplicates().copy()print(f"删除重复后记录数:{len(df_clean)}")# 2. 处理缺失值# 查看缺失情况print("\n缺失值统计:")print(df_clean.isnull().sum())# 策略:comment为空的填充为"用户未填写评价"df_clean['comment']=df_clean['comment'].fillna('用户未填写评价')# 删除rating为空的记录(关键字段不可缺失)df_clean=df_clean.dropna(subset=['rating'])# 3. 统一评分格式(统一转换为5分制)defnormalize_rating(rating):"""将评分统一为5分制"""ifpd.isna(rating):returnnp.nan rating=float(rating)ifrating>5:# 假设10分制returnround(rating/2,1)returnrating df_clean['rating_5']=df_clean['rating'].apply(normalize_rating)# 4. 清洗评论内容(去除HTML标签)importredefclean_html(text):"""去除HTML标签"""ifpd.isna(text):return""# 去除HTML标签clean=re.sub(r'<[^>]+>','',str(text))# 去除特殊字符clean=re.sub(r'[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f-\xff]','',clean)returnclean.strip()df_clean['comment_clean']=df_clean['comment'].apply(clean_html)# 5. 标准化时间格式defparse_date(date_str):"""解析多种日期格式"""ifpd.isna(date_str):returnNonedate_str=str(date_str).strip()# 尝试多种格式formats=['%Y-%m-%d','%Y/%m/%d %H:%M','%Y.%m.%d','%Y-%m-%d %H:%M:%S']forfmtinformats:try:returnpd.to_datetime(date_str,format=fmt)except:continue# 如果都失败,使用pandas自动解析try:returnpd.to_datetime(date_str)except:returnNonedf_clean['submit_time_clean']=df_clean['submit_time'].apply(parse_date)# 6. 数据筛选与排序# 筛选有效评分(1-5分)df_clean=df_clean[(df_clean['rating_5']>=1)&(df_clean['rating_5']<=5)]# 按时间排序df_clean=df_clean.sort_values('submit_time_clean',ascending=False)# 筛选高质量评价(评分>=4且评论长度>10)high_quality=df_clean[(df_clean['rating_5']>=4)&(df_clean['comment_clean'].str.len()>10)]print(f"\n高质量评价数:{len(high_quality)}")

运行结果:

(ai_env)$ python3 quality_report.py 数据形状:(6,6)前5行数据: user_id username rating comment submit_time city 0 1001 用户A 5.0 很好吃的红枣!<p>推荐购买</p> 2024-01-15 乌鲁木齐 1 1002 用户B 8.0 味道不错 2024/01/16 10:30 阿克苏 2 1003 用户C NaN NaN 2024.01.17 喀什 3 1001 用户A 5.0 很好吃的红枣!<p>推荐购买</p> 2024-01-15 乌鲁木齐 4 1004 用户D 9.0 物流很快,包装完好 2024-01-18 14:20 和田 数据信息: <class'pandas.core.frame.DataFrame'> RangeIndex: 6 entries,0 to 5Datacolumns(total 6 columns):# Column Non-Null Count Dtype----------------------------0 user_id 6 non-null int64 1 username 6 non-null object 2 rating 5 non-null float64 3 comment 5 non-null object 4 submit_time 6 non-null object 5 city 6 non-null object dtypes: float64(1),int64(1),object(4)memory usage: 416.0+ bytes 基础统计: user_id rating count 6.000000 5.000000 mean 1002.666667 6.200000 std 1.632993 2.167948 min 1001.000000 4.000000 25% 1001.250000 5.000000 50% 1002.500000 5.000000 75% 1003.750000 8.000000 max 1005.000000 9.000000 ================================================== 数据质量评估报告 ================================================== 【总记录数】 6 【总列数】 6 【缺失值统计】 user_id: 0 username: 0 rating: 1 comment: 1 submit_time: 0 city: 0 【缺失值比例】 user_id: 0.0 username: 0.0 rating: 16.67 comment: 16.67 submit_time: 0.0 city: 0.0 【重复行数】 1 【数据类型】 user_id: int64 username: object rating: float64 comment: object submit_time: object city: object ================================================== 清洗前记录数: 6 删除重复后记录数: 5 缺失值统计: user_id 0 username 0 rating 1 comment 1 submit_time 0 city 0 dtype: int64 高质量评价数: 1(ai_env)$