(3)两列冗余数据清洗

import pandas as pd
import numpy as np
import os
os.listdir()
['.ipynb_checkpoints', '两列冗余数据清洗.ipynb', '人物画像.xlsx']
renwu = pd.read_excel("./人物画像.xlsx")
renwu

在这里插入图片描述
需求:我们可以看到以上数据城市这个字段出现了信息冗余,需要将多余的国家信息清洗掉

renwu["城市"] = renwu[["国家","城市"]].apply(lambda x:x[1].replace(x[0],""),axis=1)
renwu

在这里插入图片描述
一行代码搞定!!

### 关于 Spark 数据清洗的源码与实现 #### 背景介绍 Spark 是一种高效的分布式计算框架,广泛应用于大规模数据处理场景。在实际项目中,数据清洗是一个重要的环节,它涉及去除噪声、填补缺失值以及统一字段格式等内容[^1]。 以下是基于 Spark 的数据清洗流程及其对应的源码实现: --- #### 1. **加载原始数据** 在 Spark 中,通常会使用 `spark.read` 方法来加载 CSV 或其他格式的数据文件,并将其转换为 DataFrame 结构。 ```python from pyspark.sql import SparkSession # 初始化 SparkSession spark = SparkSession.builder.appName("DataCleaning").getOrCreate() # 加载 CSV 文件到 DataFrame user_df = spark.read.format("csv") \ .option("header", "true") \ .load("/path/to/user.csv") event_df = spark.read.format("csv") \ .option("header", "true") \ .load("/path/to/event.csv") ``` 此部分代码用于读取用户表 (`user.csv`) 和事件表 (`event.csv`) 并初始化为 DataFrame 对象[^2]。 --- #### 2. **检测重复属性** 对于给定的任务需求,需要判断是否存在重复列名或冗余字段(如 “申请时间” vs “created_at”,“创建时间” vs “updated_at”)。可以通过以下方式完成: ```python def check_duplicate_columns(df, column_pairs): """ 检查指定的列对是否具有相同的值分布。 :param df: 输入的 DataFrame :param column_pairs: 列对列表 [(col1, col2), ...] :return: 是否存在完全一致的列对 """ duplicate_found = False for (col1, col2) in column_pairs: if set(df.select(col1).rdd.map(lambda row: row[col1]).collect()) == \ set(df.select(col2).rdd.map(lambda row: row[col2]).collect()): print(f"Columns {col1} and {col2} are duplicates.") duplicate_found = True return duplicate_found # 定义可能的重复列对 column_pairs_to_check = [("apply_time", "created_at"), ("create_time", "updated_at")] # 执行检查 if not check_duplicate_columns(user_df, column_pairs_to_check): print("No exact duplicate columns found.") ``` 该函数通过比较两列的唯一值集合来判定它们是否表示相同的信息[^3]。 --- #### 3. **执行具体的数据清洗逻辑** ##### (1)删除多余列 如果确认某些列为冗余,则可以直接移除这些列: ```python cleaned_user_df = user_df.drop("apply_time", "create_time") ``` ##### (2)填充缺失值 针对数值型和字符串类型的字段分别采用不同的策略进行补全: ```python from pyspark.sql.functions import lit # 数值型字段用均值填充 mean_value = cleaned_user_df.selectExpr("avg(age)").first()[0] filled_age_df = cleaned_user_df.fillna({"age": mean_value}) # 字符串型字段用默认值填充 default_city = "Unknown" final_cleaned_df = filled_age_df.fillna({"city": default_city}) ``` ##### (3)过滤异常记录 剔除不符合业务规则的数据行,例如年龄小于等于零的情况: ```python filtered_df = final_cleaned_df.filter(final_cleaned_df["age"] > 0) ``` --- #### 4. **保存清理后的结果** 最终将清洗完毕的数据写入目标路径 `/diliveryoutput2`,并设置分区数量为 1: ```python filtered_df.repartition(1).write.mode("overwrite").format("parquet").save("/diliveryoutput2") ``` 以上步骤涵盖了从数据加载、预处理到存储的核心过程[^1]。 --- ### 总结 上述代码片段展示了如何利用 PySpark 进行基本的数据清洗工作,包括但不限于去重、填缺、过滤等功能模块。整个流程依赖于 Spark 提供的强大 API 支持,能够有效应对 TB 级别的海量数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值