处理缺失值、重复数据、异常值,标准化数据格式
使用 retail_orders 数据集,包含订单ID、客户ID、产品信息、订单日期、销售额、数量等字段。
缺失值是数据分析中最常见的问题之一。Pandas使用 NaN 表示缺失值。
df.isnull() 检测缺失值,返回布尔值DataFrame。
import pandas as pd
df = pd.read_csv('retail_orders.csv')
# 检测每列的缺失值数量
print(df.isnull().sum())
# 检测是否有缺失值
print(df.isnull().any())
对于缺失值,可以选择删除含有缺失值的行或列。
# 删除含有缺失值的行 df_cleaned = df.dropna() # 删除缺失值比例超过50%的列 threshold = len(df) * 0.5 df_cleaned = df.dropna(thresh=threshold, axis=1)
有时候删除缺失值会丢失重要信息,可以用均值、中位数、众数或指定值填充。
# 用均值填充数值列的缺失值 df['sales'] = df['sales'].fillna(df['sales'].mean()) # 用中位数填充 df['quantity'] = df['quantity'].fillna(df['quantity'].median()) # 用众数填充分类变量 df['category'] = df['category'].fillna(df['category'].mode()[0]) # 用前一个值填充(前向填充) df['price'] = df['price'].fillna(method='ffill')
重复数据会干扰分析结果,需要识别并删除。
# 检测重复行 print(df.duplicated().sum()) # 查看重复行的详细信息 print(df[df.duplicated(keep=False)]) # 删除重复行(保留第一次出现的) df_unique = df.drop_duplicates() # 基于特定列删除重复 df_unique = df.drop_duplicates(subset=['order_id', 'product_id'])
keep=False 可以显示所有重复的行,方便查看具体情况。
异常值(离群点)是偏离正常范围的数据点,可能由错误或真实极端值造成。
# 使用IQR方法检测异常值 Q1 = df['sales'].quantile(0.25) Q3 = df['sales'].quantile(0.75) IQR = Q3 - Q1 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR # 筛选正常范围内的数据 df_normal = df[(df['sales'] >= lower_bound) & (df['sales'] <= upper_bound)] # 或者用Z-score方法 from scipy import stats z_scores = stats.zscore(df['sales']) df_normal = df[abs(z_scores) < 3]
确保数据类型正确是数据清洗的重要步骤,错误的类型会导致计算错误。
# 查看数据类型 print(df.dtypes) # 转换数据类型 df['order_date'] = pd.to_datetime(df['order_date']) df['quantity'] = df['quantity'].astype(int) df['sales'] = df['sales'].astype(float) # 清理字符串中的空格 df['product_name'] = df['product_name'].str.strip() df['category'] = df['category'].str.upper()
字符串数据常包含多余的空格、特殊字符或大小写不一致的问题。
# 去除首尾空格
df['product_name'] = df['product_name'].str.strip()
# 统一大小写
df['category'] = df['category'].str.lower() # 转小写
df['brand'] = df['brand'].str.upper() # 转大写
# 替换特殊字符
df['address'] = df['address'].str.replace('\n', ' ')
df['phone'] = df['phone'].str.replace(r'[^\d]', '', regex=True)
# 去除数字中的逗号
df['price'] = df['price'].str.replace(',', '').astype(float)