Python 数据分析必备的 12 种数据清洗技术
数据清洗是数据分析的第一步,它的好坏直接影响到后续分析的准确性和可靠性。下面我们将详细介绍 12 种常见的数据清洗技术,并通过实际的代码示例来帮助大家更好地理解和掌握这些技术。
创作不易,还请各位同学三连点赞!!收藏!!转发!!! 1. 删除缺失值数据集中经常会有一些缺失值,这些缺失值可能会干扰我们的分析。我们可以选择删除含有缺失值的行或列。
import pandas as pd # 创建一个包含缺失值的数据集 data = { 'A': [1, 2, None, 4], 'B': [5, None, 7, 8], 'C': [9, 10, 11, 12] } df = pd.DataFrame(data) # 删除含有缺失值的行 df.dropna(inplace=True) print(df)输出结果:
A B C 3 4 8 12解释:
dropna() 方法用于删除含有缺失值的行或列。
inplace=True 参数表示直接在原数据上进行操作,不返回新的 DataFrame。
2. 填充缺失值有时候删除缺失值并不是最佳选择,我们可以选择填充缺失值。常见的填充方法包括使用均值、中位数、众数等。
# 填充缺失值 df = pd.DataFrame(data) # 使用均值填充 df.fillna(df.mean(), inplace=True) print(df)输出结果:
A B C 0 1.0 5.0 9 1 2.0 7.5 10 2 3.0 7.0 11 3 4.0 8.0 12解释:
fillna() 方法用于填充缺失值。
df.mean() 计算每一列的均值,并用这些均值填充缺失值。
3. 删除重复值数据集中可能会有重复的记录,这些重复记录会影响分析结果。我们可以使用 drop_duplicates() 方法删除重复值。
# 创建一个包含重复值的数据集 data = { 'A': [1, 2, 2, 4], 'B': [5, 6, 6, 8], 'C': [9, 10, 10, 12] } df = pd.DataFrame(data) # 删除重复值 df.drop_duplicates(inplace=True) print(df)输出结果:
A B C 0 1 5 9 1 2 6 10 3 4 8 12解释:
drop_duplicates() 方法用于删除重复的行。
inplace=True 参数表示直接在原数据上进行操作,不返回新的 DataFrame。
4. 转换数据类型有时候数据的类型可能不符合我们的需求,我们需要转换数据类型。例如,将字符串类型的数字转换为数值类型。
# 创建一个包含字符串类型数字的数据集 data = { 'A': ['1', '2', '3', '4'], 'B': ['5', '6', '7', '8'] } df = pd.DataFrame(data) # 转换数据类型 df['A'] = df['A'].astype(int) df['B'] = df['B'].astype(float) print(df)输出结果:
A B 0 1 5.0 1 2 6.0 2 3 7.0 3 4 8.0解释:
astype() 方法用于转换数据类型。
int 和 float 分别表示整数和浮点数类型。
5. 处理异常值异常值是指那些与其他数据明显不同的值,它们可能会对分析结果产生负面影响。我们可以使用统计方法来检测和处理异常值。
# 创建一个包含异常值的数据集 data = { 'A': [1, 2, 3, 100], 'B': [5, 6, 7, 8] } df = pd.DataFrame(data) # 检测异常值 Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 # 定义异常值的范围 lower_bound = Q1 - 1.5 * IQR upper_bound = Q3 + 1.5 * IQR # 删除异常值 df = df[~((df < lower_bound) | (df > upper_bound)).any(axis=1)] print(df)输出结果:
A B 0 1 5 1 2 6 2 3 7解释:
quantile() 方法用于计算四分位数。
IQR 表示四分位距,即第三四分位数减去第一四分位数。
lower_bound 和 upper_bound 分别表示异常值的下界和上界。
~ 符号表示取反,any(axis=1) 表示任何一列有异常值的行都会被删除。
6. 标准化和归一化标准化和归一化是数据预处理中的重要步骤,它们可以将数据转换到相同的尺度,便于后续的分析和建模。
from sklearn.preprocessing import StandardScaler, MinMaxScaler # 创建一个数据集 data = { 'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8] } df = pd.DataFrame(data) # 标准化 scaler = StandardScaler() df_scaled = scaler.fit_transform(df) df_scaled = pd.DataFrame(df_scaled, columns=df.columns) print("标准化后的数据:") print(df_scaled) # 归一化 scaler = MinMaxScaler() df_normalized = scaler.fit_transform(df) df_normalized = pd.DataFrame(df_normalized, columns=df.columns) print("\n归一化后的数据:") print(df_normalized)输出结果:
标准化后的数据: A B 0 -1.341641 -1.341641 1 -0.447214 -0.447214 2 0.447214 0.447214 3 1.341641 1.341641 归一化后的数据: A B 0 0.000000 0.000000 1 0.333333 0.333333 2 0.666667 0.666667 3 1.000000 1.000000解释:
StandardScaler 用于标准化,将数据转换为均值为 0,标准差为 1 的分布。
MinMaxScaler 用于归一化,将数据缩放到 [0, 1] 区间。
7. 重命名列名有时候我们需要对数据集的列名进行重命名,以便更好地理解和使用数据。
# 创建一个数据集 data = { 'A': [1, 2, 3, 4], 'B': [5, 6, 7, 8] } df = pd.DataFrame(data) # 重命名列名 df.rename(columns={'A': 'Column1', 'B': 'Column2'}, inplace=True) print(df)输出结果:
Column1 Column2 0 1 5 1 2 6 2 3 7 3 4 8解释:
rename() 方法用于重命名列名。
columns 参数是一个字典,键是旧列名,值是新列名。
inplace=True 参数表示直接在原数据上进行操作,不返回新的 DataFrame。
8. 合并数据集在数据分析中,我们经常需要将多个数据集合并在一起。Pandas 提供了多种合并方法,如 concat 和 merge。
# 创建两个数据集 data1 = { 'A': [1, 2, 3], 'B': [4, 5, 6] } df1 = pd.DataFrame(data1) data2 = { 'A': [4, 5, 6], 'B': [7, 8, 9] } df2 = pd.DataFrame(data2) # 使用 concat 合并数据集 df_concat = pd.concat([df1, df2], ignore_index=True) print("使用 concat 合并的数据集:") print(df_concat) # 使用 merge 合并数据集 df_merge = pd.merge(df1, df2, on='A', how='outer') print("\n使用 merge 合并的数据集:") print(df_merge)输出结果:
使用 concat 合并的数据集: A B 0 1 4 1 2 5 2 3 6 3 4 7 4 5 8 5 6 9 使用 merge 合并的数据集: A B_x B_y 0 1.0 4.0 NaN 1 2.0 5.0 NaN 2 3.0 6.0 NaN 3 4.0 NaN 7.0 4 5.0 NaN 8.0 5 6.0 NaN 9.0解释:
pd.concat() 方法用于纵向或横向拼接多个数据集。
ignore_index=True 参数表示重新生成索引。
pd.merge() 方法用于根据指定的列进行合并。
on='A' 参数表示根据列 ‘A’ 进行合并。
how='outer' 参数表示外连接,保留所有数据。
9. 日期时间处理日期时间数据在数据分析中非常常见,我们需要学会如何处理这些数据。
# 创建一个包含日期时间的数据集 data = { 'Date': ['2023-01-01', '2023-01-02', '2023-01-03'], 'Value': [10, 20, 30] } df = pd.DataFrame(data) # 将日期时间列转换为 datetime 类型 df['Date'] = pd.to_datetime(df['Date']) # 提取年份、月份和日期 df['Year'] = df['Date'].dt.year df['Month'] = df['Date'].dt.month df['Day'] = df['Date'].dt.day print(df)输出结果:
Date Value Year Month Day 0 2023-01-01 10 2023 1 1 1 2023-01-02 20 2023 1 2 2 2023-01-03 30 2023 1 3解释:
pd.to_datetime() 方法用于将字符串类型的日期时间转换为 datetime 类型。
dt 属性提供了多种日期时间相关的操作,如提取年份、月份和日期。
10. 文本数据处理文本数据在数据分析中也很常见,我们需要学会如何处理这些数据。
# 创建一个包含文本数据的数据集 data = { 'Text': ['hello world', 'python programming', 'data science'] } df = pd.DataFrame(data) # 将文本数据转换为小写 df['Text'] = df['Text'].str.lower() # 替换特定字符 df['Text'] = df['Text'].str.replace(' ', '_') print(df)输出结果:
Text 0 hello_world 1 python_programming 2 data_science解释:
str.lower() 方法用于将文本数据转换为小写。
str.replace() 方法用于替换文本中的特定字符。
11. 处理分类数据分类数据在数据分析中也很常见,我们需要学会如何处理这些数据。
# 创建一个包含分类数据的数据集 data = { 'Category': ['A', 'B', 'A', 'C', 'B', 'A'] } df = pd.DataFrame(data) # 将分类数据转换为类别类型 df['Category'] = df['Category'].astype('category') # 查看类别及其编码 print(df['Category'].cat.codes)输出结果:
0 0 1 1 2 0 3 2 4 1 5 0 Name: Category, dtype: int8解释:
astype('category') 方法用于将数据转换为类别类型。
cat.codes 属性用于查看类别的编码。
12. 处理缺失值的高级技巧除了简单的删除和填充缺失值,还有一些高级技巧可以帮助我们更好地处理缺失值。
# 创建一个包含缺失值的数据集 data = { 'A': [1, 2, None, 4], 'B': [5, None, 7, 8], 'C': [9, 10, 11, 12] } df = pd.DataFrame(data) # 使用前向填充 df.fillna(method='ffill', inplace=True) print("前向填充后的数据:") print(df) # 使用后向填充 df = pd.DataFrame(data) df.fillna(method='bfill', inplace=True) print("\n后向填充后的数据:") print(df)输出结果:
前向填充后的数据: A B C 0 1.0 5.0 9 1 2.0 5.0 10 2 2.0 7.0 11 3 4.0 8.0 12 后向填充后的数据: A B C 0 1.0 5.0 9 1 2.0 7.0 10 2 4.0 7.0 11 3 4.0 8.0 12 总结以上介绍了十二种常用的数据清洗技术,包括删除缺失值、填充缺失值、删除重复值、转换数据类型、处理异常值、标准化与归一化、重命名列名、合并数据集、日期时间处理、文本数据处理、处理分类数据以及处理缺失值的高级技巧。通过实际代码示例展示了每种技术的具体应用,有助于读者更好地理解和掌握这些技术。