数据预处理_Python

1 数据清洗

1.1 数据缺失

1.1.1 数值型数据缺失

(1) 识别方法

①描述性分析

import pandas as pd

# 创建示例 DataFrame
data = {
    'age': [25, None, 30, None, 40],
    'height': [170, 175, 180, 165, 185]
}
df = pd.DataFrame(data)

# 找出 age 字段数据缺失的行
# isnull()或isna()
missing_data = df[df['age'].isnull()]

print("缺失数据的行:\n", missing_data)

(2) 处理方法

①删除

# 删除列值有缺失的行
import pandas as pd

data = pd.DataFrame({
    'col1': [1, None, 3],
    'col2': ['a', 'b', None]
})

data = data.dropna(subset=['col1'])
print(data)

②填充法

import pandas as pd

# 创建包含缺失值的 DataFrame
data_missing_constant = {
    'Age': [25, None, 30, 35, None],
    'Salary': [50000, None, 60000, None, 70000],
    'Experience': [5, 10, None, 15, None],
    'Bonus': [None, 2000, 3000, None, 4000],
    'Performance': [None, 80, 90, None, 100]
}
df_missing_constant = pd.DataFrame(data_missing_constant)

# 填充规则
# 1. 常数填充
df_missing_constant['Age'] = df_missing_constant['Age'].fillna(20)

# 2. 中位数填充
median_salary = df_missing_constant['Salary'].median()
df_missing_constant['Salary'] = df_missing_constant['Salary'].fillna(median_salary)

# 3. 均值填充
mean_experience = df_missing_constant['Experience'].mean()
df_missing_constant['Experience'] = df_missing_constant['Experience'].fillna(mean_experience)

# 4. 三倍标准差法下边界填充
bonus_mean = df_missing_constant['Bonus'].mean()
bonus_std = df_missing_constant['Bonus'].std()
bonus_lower_bound = bonus_mean - 3 * bonus_std
df_missing_constant['Bonus'] = df_missing_constant['Bonus'].fillna(bonus_lower_bound)

# 5. 四分位距法下边界填充
q1 = df_missing_constant['Performance'].quantile(0.25)
q3 = df_missing_constant['Performance'].quantile(0.75)
iqr = q3 - q1
performance_lower_bound = q1 - 1.5 * iqr
df_missing_constant['Performance'] = df_missing_constant['Performance'].fillna(performance_lower_bound)

# 输出说明文字和填充后的 DataFrame
output_description = (
    "填充说明:'Age' 列使用常数 20 填充;"
    "'Salary' 列使用中位数填充;"
    "'Experience' 列使用均值填充;"
    "'Bonus' 列使用三倍标准差法下边界填充;"
    "'Performance' 列使用四分位距法下边界填充。"
)

print(output_description)
print("\n缺失值处理 - 填充后的 DataFrame:\n", df_missing_constant)

1.1.2 类别型数据缺失

1.2 数据重复

1.2.1 全字段重复

(1) 识别和处理_数据重复特征分析_基于全字段匹配
import pandas as pd

data = {
    'id': [1, 2, 2, 2, 3, 4, 4],
    'name': ['Alice', 'Bob', 'Bob', 'Bob', 'Charlie', 'David', 'David'],
    'date': ['2023 - 01 - 01', '2023 - 02 - 01', '2023 - 02 - 15', '2023 - 02 - 15', '2023 - 03 - 01', '2023 - 04 - 01', '2023 - 04 - 10']
}
df = pd.DataFrame(data)
# 将日期列转换为日期时间类型
df['date'] = pd.to_datetime(df['date'])

# 打印原始 DataFrame
print(f"原始 DataFrame:\n{df}")

# 基于全字段匹配 识别重复行
duplicate_rows = df[df.duplicated()]
# 打印重复行
print(f"\n重复的行:\n{duplicate_rows}")

# 删除完全重复的数据并打印结果
print(f"\n删除完全重复数据后的 DataFrame:\n{df.drop_duplicates()}")

1.2.2 关键字段重复

(1) 识别和处理_数据重复特征分析_基于关键字段匹配
import pandas as pd

# 创建示例 DataFrame
data = {
    'id': [1, 2, 2, 2, 3, 4, 4],
    'name': ['Alice', 'Bob', 'Bob', 'Bob', 'Charlie', 'David', 'David'],
    'date': ['2023 - 01 - 01', '2023 - 02 - 01', '2023 - 02 - 15', '2023 - 02 - 15', '2023 - 03 - 01', '2023 - 04 - 01', '2023 - 04 - 10'],
    'value': [100, 200, 250, 250, 300, 400, 450]
}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])

# 定义关键字段
key_columns = ['id', 'name']

# 识别部分重复的行
duplicated_rows = df[df.duplicated(subset=key_columns, keep=False)]
print(f"原数据:\n{df}")
print(f"\n部分重复的数据:\n{duplicated_rows}")

# 处理部分重复数据,按 date 列取最新一条
df_processed = df.sort_values('date').drop_duplicates(subset=key_columns, keep='last')
print(f"\n部分重复时取最新一条后的 DataFrame:\n{df_processed}")

1.3 数据值异常

1.3.1 数值型数据异常

(1) 识别方法

        ①异常值检测_范围检查法

import pandas as pd

# 创建示例 DataFrame
data = {
    'age': [20, 25, 30, 150, 35],
    'score': [80, 90, 105, 75, 60]
}
df = pd.DataFrame(data)

# 定义各列的合理范围
ranges = {
    'age': (0, 120),
    'score': (0, 100)
}

# 查找异常值
for column, (lower_bound, upper_bound) in ranges.items():
    outliers = df[(df[column] < lower_bound) | (df[column] > upper_bound)][column]
    if not outliers.empty:
        print(f"列 {column} 的异常值: {outliers.tolist()}")
    else:
        print(f"列 {column} 没有异常值。")

        ②异常值检测_三倍标准差法

import pandas as pd
import numpy as np

# 创建包含多列的示例 DataFrame,修改 col1 数据
data = {
    'col1': [2, 3, 4, 3, 5, 4, 6, 3, 4, 5, 50],
    'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110]
}
df = pd.DataFrame(data)

# 计算 col1 列的均值与标准差
mean = df['col1'].mean()
std = df['col1'].std()

# 计算下限和上限
lower_bound = mean - 3 * std
upper_bound = mean + 3 * std

# 找出异常值
outliers = df[(df['col1'] < lower_bound) | (df['col1'] > upper_bound)][
    'col1'].tolist()

print("原始数据:")
print(df)
print(f"\n正在处理的列: col1")
print(f"该列均值: {mean:.2f}")
print(f"该列标准差: {std:.2f}")
print(f"下限: {lower_bound:.2f}")
print(f"上限: {upper_bound:.2f}")
print(f"异常值: {outliers}")

        ③异常值检测_四分位距法

import pandas as pd
import numpy as np

# 创建一个包含两列的 DataFrame 示例数据
data = {
    'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100],
    'col2': [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 200]
}
df = pd.DataFrame(data)

# 计算第一四分位数(Q1)和第三四分位数(Q3)
q1 = np.percentile(df['col1'], 25)
q3 = np.percentile(df['col1'], 75)

# 计算四分位距(IQR)
iqr = q3 - q1

# 计算下限和上限
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr

# 找出异常值
outliers = df['col1'][(df['col1'] < lower_bound) | (df['col1'] > upper_bound)]

print("原始数据:")
print(df)
print("第一四分位数 (Q1):", q1)
print("第三四分位数 (Q3):", q3)
print("四分位距 (IQR):", iqr)
print("下限:", lower_bound)
print("上限:", upper_bound)
print("异常值:", outliers.values)

(2) 处理方法

        ①基于异常值检测的删除

import pandas as pd

# 示例数据
data = pd.DataFrame({
    'A': [1, 2, 3, 4, 5, 6, 7, 8, 9, 100],
    'B': [10, 20, 30, 40, 50, 60, 70, 80, 90, 1000]
})

# 计算字段 A 的第一四分位数(Q1)和第三四分位数(Q3)
Q1 = data['A'].quantile(0.25)
Q3 = data['A'].quantile(0.75)

# 计算四分位距(IQR)
IQR = Q3 - Q1

# 定义异常值的上下边界
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 筛选出字段 A 中不在异常值范围内的数据
filtered_data = data[(data['A'] >= lower_bound) & (data['A'] <= upper_bound)]

# 输出结果
print("处理前的数据:", data)
print("处理后的数据:", filtered_data)  

1.3.2 类别型数据异常

(1) 识别方法

        ①分布分析

import pandas as pd

# 构造示例数据,包含两个字段,我们只分析category_column字段
data = {
    'category_column': ['A', 'B', 'A', None, 'C', 'D', 'A', 'B', 'E'],
    'another_column': [10, 20, 10, 30, 40, 50, 10, 20, 60]
}
df = pd.DataFrame(data)

# 统计category_column字段每个取值的数量
# dropna=False:把缺失值也纳入统计范围
value_counts = df['category_column'].value_counts(dropna=False)
print(value_counts)

# 根据数量判断异常(例如,出现次数过少的可能是异常值,缺失值数量过多也需关注)
# 这里简单设定出现次数小于2的可能是异常值,可根据实际情况调整
print("可能的异常值:", value_counts[value_counts < 2].index.tolist())
print("缺失值数量:", df['category_column'].isnull().sum())

        ②合规性检查_数据字典匹配

import pandas as pd


def dictionary_method(data, column, valid_values):
    """
    此函数使用字典法识别分类型数据的异常值
    :param data: 包含分类型数据的 DataFrame
    :param column: 需要检查的列名
    :param valid_values: 合法取值列表
    :return: 包含异常值的 DataFrame
    """
    return data[~data[column].isin(valid_values)]


# 示例数据,包含两列
data = {
    'category': ['A', 'B', 'A', 'C', 'D', 'B', 'E', 'A', 'B', 'F', None],
    'other_column': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
}
df = pd.DataFrame(data)

# 打印原始数据
print("原始数据:", df)

# 合法取值列表
valid_values = ['A', 'B', 'C']
outliers_dict = dictionary_method(df, 'category', valid_values)
print("字典法识别的异常值:", outliers_dict)

1.4 数据格式异常

(1) 日期格式异常、数值格式异常和文本格式异常

import pandas as pd

data = {
  'sale_date': ['2025-04-01', '2025-1-5', '2025-05-01','2025-07-01'],
    'amount': ["1,000.50", "1000.50", "1010.50","2000.00"],
    'product_name': ['   space at start', 'UPPERCASE', '&embedded special char']
}
df = pd.DataFrame(data)

print("原始数据:")
print(df)

# 处理sale_date列,转换为日期时间格式
df['sale_date'] = pd.to_datetime(df['sale_date'])
# 处理amount列,去除逗号并转换为浮点数
df['amount'] = df['amount'].str.replace(',', '').astype(float)
# 处理product_name列,去掉首位空格、替换&字符并转小写
df['product_name'] = df['product_name'].str.strip().str.replace('&', '').str.lower()

print("处理后的数据:")
print(df)

2 数据转换

2.1 隐私数据转换

import pandas as pd

data = {
    'name': ['Alice', 'Bob'],
   'mobile': ['13800138001', '13900139002']
}
df = pd.DataFrame(data)

print(f"原始数据:\n{df}")

df['mobile'] = df['mobile'].str[: - 4]+'****'

print(f"加密后的数据:\n{df}")

3 数据集成

3.1 数据源集成

① 按行合并

import pandas as pd

# 创建示例DataFrame1
data1 = {
    'col1': [1, 2],
    'col2': ['a', 'b']
}
df1 = pd.DataFrame(data1)

# 创建示例DataFrame2
data2 = {
    'col1': [3, 4],
    'col2': ['c', 'd']
}
df2 = pd.DataFrame(data2)

print(f"合并前的DataFrame1:\n{df1}")
print(f"合并前的DataFrame2:\n{df2}")

# axis = 0:按行合并
result = pd.concat([df1, df2], axis = 0)
# 指定数据类型
result['col1'] = result['col1'].astype('float64')
result['col2'] = result['col2'].astype('string')
# 重命名列
result = result.rename(columns = {'col1': 'new_col1', 'col2': 'new_col2'})

print(f"\n合并后的数据:\n{result}")

②按列合并

import pandas as pd

# 创建示例DataFrame1
data1 = {
    'col1': [1, 2],
    'col2': ['a', 'b']
}
df1 = pd.DataFrame(data1)

# 创建示例DataFrame2
data2 = {
    'col3': [3, 4],
    'col4': ['c', 'd']
}
df2 = pd.DataFrame(data2)

print(f"合并前的DataFrame1:\n{df1}")
print(f"合并前的DataFrame2:\n{df2}")

# 按列合并
result = pd.concat([df1, df2], axis = 1)
# 指定数据类型
result['col1'] = result['col1'].astype('float64')
result['col2'] = result['col2'].astype('string')
result['col3'] = result['col3'].astype('float64')
result['col4'] = result['col4'].astype('string')
# 重命名列
result = result.rename(columns = {'col1': 'new_col1', 'col2': 'new_col2', 'col3': 'new_col3', 'col4': 'new_col4'})

print(f"\n合并后的数据:\n{result}")

数据预处理数据分析中非常重要的一个环节,它可以让原始数据更加适合用于各种分析和建模任务。常见的数据预处理包括数据清洗、缺失值处理、异常值处理、特征选择、特征缩放和特征变换等。下面我们将介绍一些常见的数据预处理方法。 1. 数据清洗 数据清洗是指在数据中去除不合理、重复或者无效的数据,保证数据的完整性和准确性。常见的数据清洗方法包括: - 删除重复数据 - 去除异常值 - 去除不合理数据 - 填充缺失值 2. 缺失值处理 缺失值是指数据集中某些数据缺失的情况。常见的缺失值处理方法包括: - 删除缺失值 - 插值法填补缺失值 - 使用平均值、中位数、众数等统计量填补缺失值 3. 异常值处理 异常值是指数据集中不符合正常规律的数据。常见的异常值处理方法包括: - 删除异常值 - 修改异常值 - 使用插值法填补异常值 4. 特征选择 特征选择是指从原始数据中选择最具有代表性的特征,以便用于分析和建模。常见的特征选择方法包括: - 过滤式特征选择 - 包裹式特征选择 - 嵌入式特征选择 5. 特征缩放 特征缩放是指将不同量纲的特征缩放到相同的范围内。常见的特征缩放方法包括: - 标准化 - 归一化 - 对数变换 6. 特征变换 特征变换是指通过对原始数据进行某些变换,使得数据更适合用于分析和建模。常见的特征变换方法包括: - 主成分分析(PCA) - 线性判别分析(LDA) - 因子分析 以上就是一些常见的数据预处理方法,通过对数据进行适当的预处理,可以提高数据分析和建模的准确性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值