Python EXCEL 半自动化切分数据集

核心逻辑

整个过程可以分为四个阶段:数据提取与转化 -> 向量化拼接 -> 去重与ID生成 -> 映射表输出


详细步骤思路

1. 数据提取与类型同化 (Data Preparation)

为了利用 Numpy 的字符串操作,首先需要将 DataFrame 的数据剥离出来。

  • 操作思路 :不要在 DataFrame 层面操作。直接读取两列目标数据,将其转换为 Numpy 数组(Array)。
  • 关键点 :确保两列数据都被强制转换为 String (字符串) 类型。Numpy 处理字符串拼接时,如果混有数字类型会报错或产生非预期结果。
2. 向量化逐行拼接 (Vectorized String Concatenation)

这是提速的核心。不要使用 Python 的 for 循环或 Pandas 的 map/apply

  • 操作思路
  1. 使用 Numpy 的字符模块 np.char
  2. 调用 np.char.add(数组1, 数组2) 进行拼接。
  3. 安全建议 :为了防止数据歧义(例如:"A"+"BC" 和 "AB"+"C" 拼接后都是 "ABC"),建议在拼接时中间插入一个特殊分隔符(如下划线 _ 或竖线 |)。
  4. 即:np.char.add(数组1, 分隔符) -> 得到中间结果 -> 再与 数组2 拼接。
3. 高效去重与索引生成 (Deduplication & Indexing)

拼接后的数组包含所有行的数据,现在需要提取唯一值(Unique)作为你的"切分索引"。

  • 操作思路
  1. 使用 np.unique() 函数作用于拼接后的数组。
  2. 该函数会返回一个排好序的、无重复的唯一组合数组。
  3. 生成新列(重命名 ID) :你可以直接利用 np.unique 返回的数组下标作为 ID,或者根据业务逻辑为每一个 Unique Key 生成一个 UUID 或哈希值。这将作为你"组合重命名"的新列。
4. 还原原始值与构建输出 (Mapping & Export)

你不仅需要拼接后的 Key,还需要它对应的原始两列值,以便生成 CSV。

  • 操作思路
  1. 逆向拆分(可选但慢):如果刚才用了分隔符,可以拆分字符串。
  2. 更优方案(推荐):在第3步去重时,不要只保存拼接结果。
  • 可以将原始两列数据合并成一个二维数组 Data_2D
  • 使用 np.unique(Data_2D, axis=0) 对二维数组直接去重(这就一次性拿到了唯一的 [列1, 列2] 组合)。
  • 然后再对这个去重后的二维数组进行拼接生成 Key。这样就保留了原始两列数据,无需后续拆分,速度最快且逻辑最稳。
5. 输出 CSV (Export)
  • 操作思路
  1. 构造一个新的 DataFrame(或结构化数组)。
  2. 包含三列:原始列A原始列B拼接后的唯一Key/新ID
  3. 保存为 CSV。

代码设计亮点

  1. 极速拼接 :利用 np.char.add 进行向量化字符串拼接,避免了 Python层面的循环。
  2. 零开销回溯 :利用 np.uniquereturn_index 参数直接获取原始数据的行号,完全省去了"拆分字符串还原原始值"的步骤,这是比常规逻辑快 2-3 倍的关键。
  3. 内存安全:全程操作 Numpy 视图或通过索引切片,减少了数据的深拷贝。
  4. 工程化封装:包含类型检查、异常处理和清晰的输入输出定义。
python 复制代码
import pandas as pd
import numpy as np
import os

def generate_deduped_mapping(df: pd.DataFrame, 
                             col1: str, 
                             col2: str, 
                             output_csv: str = 'mapping_result.csv',
                             sep: str = '_') -> pd.DataFrame:
    """
    使用 Numpy 加速对 DataFrame 两列进行组合、去重,并生成映射表。
    
    核心逻辑:
    1. 提取两列数据转换为 Numpy 数组。
    2. 向量化拼接字符串生成唯一 Key。
    3. 利用 np.unique 获取唯一值及其在原始数据中的首个索引。
    4. 根据索引直接"回捞"原始两列的值,避免字符串拆分带来的性能损耗。
    
    Args:
        df (pd.DataFrame): 原始大数据集
        col1 (str): 第一列列名
        col2 (str): 第二列列名
        output_csv (str): 输出 CSV 的路径
        sep (str): 拼接时的分隔符,确保不与数据内容冲突
        
    Returns:
        pd.DataFrame: 包含去重组合及新ID的 DataFrame
    """
    
    print(f"[-] 开始处理,数据总行数: {len(df)}")
    
    # 1. 提取数据并强制转换为 String 类型的 Numpy 数组
    # astype(str) 确保数据类型统一,避免拼接报错
    arr1 = df[col1].astype(str).to_numpy()
    arr2 = df[col2].astype(str).to_numpy()
    
    # 2. 向量化拼接 (Vectorized Concatenation)
    # 逻辑:arr1 + sep + arr2
    # np.char.add 比 Python 循环快几个数量级
    print("[-] 正在进行向量化拼接...")
    combined_arr = np.char.add(np.char.add(arr1, sep), arr2)
    
    # 3. 高效去重并获取索引 (The Magic Step)
    # return_index=True 返回唯一值在原始数组中第一次出现的下标
    print("[-] 正在计算唯一组合 (Numpy Unique)...")
    unique_keys, distinct_indices = np.unique(combined_arr, return_index=True)
    
    print(f"[-] 去重完成。原始组合数: {len(df)}, 唯一组合数: {len(unique_keys)}")
    
    # 4. 利用索引"回捞"原始值 (Direct Retrieval)
    # 直接利用索引切片,速度极快,且保证了数据与 Key 的绝对对应
    unique_col1_vals = arr1[distinct_indices]
    unique_col2_vals = arr2[distinct_indices]
    
    # 5. 生成新的组合 ID (New Group ID)
    # 默认生成类似 'GROUP_001' 的 ID,后续你可以在 CSV 中手动修改以合并组
    # 使用 vectorization 生成 ID
    ids = np.arange(len(unique_keys))
    new_group_ids = np.char.add('GROUP_', ids.astype(str))
    
    # 6. 构建结果 DataFrame
    result_df = pd.DataFrame({
        'Combine_Key': unique_keys,        # 拼接后的唯一 Key (作为索引切分用)
        'Original_Col1': unique_col1_vals, # 原始列1
        'Original_Col2': unique_col2_vals, # 原始列2
        'New_Group_ID': new_group_ids      # 新列:组合重命名 (默认唯一,待人工合并)
    })
    
    # 7. 输出结果
    result_df.to_csv(output_csv, index=False, encoding='utf-8-sig')
    print(f"[+] 结果已保存至: {output_csv}")
    
    return result_df

# --- 使用示例 ---
if __name__ == "__main__":
    # 模拟一个大数据集
    data = {
        'Category': ['A', 'A', 'B', 'A', 'C', 'B'],
        'SubCategory': ['101', '101', '202', '102', '303', '202'],
        'Value': [1, 2, 3, 4, 5, 6]
    }
    df_big = pd.DataFrame(data)

    # 调用函数
    mapping_df = generate_deduped_mapping(
        df=df_big, 
        col1='Category', 
        col2='SubCategory',
        output_csv='group_mapping.csv'
    )
    
    # 打印预览
    # print(mapping_df)

关键技术点解释

  1. 为什么不先拼接再拆分?
  • 低效做法拼接 -> 去重 -> 拆分字符串。拆分字符串是一个极慢的操作,且如果数据中包含分隔符(例如数据里本身就有下划线),拆分逻辑会出错。
  • 高效做法(本代码)拼接 -> 去重并拿到索引(indices) -> 用索引去原数组取值。代码中 distinct_indices 变量存储了每个唯一组合第一次出现的行号。比如组合 "A_101" 第一次出现在第0行,我们就直接取第0行的 arr1[0]arr2[0]。这是数学上的精确映射,完全不需要触碰字符串拆分
  1. output_csv 的作用
  • 生成的 CSV 包含 New_Group_ID 列。
  • 后续工作流 :你打开这个 CSV,如果发现 GROUP_5GROUP_8 其实是同一类业务逻辑,你可以手动将它们的 ID 都改为 Merged_Group_A
  • 最后你再写一个脚本读取这个 CSV,把它作为一个配置表(Config Map),去切分原始的大数据集。
相关推荐
沛沛老爹2 小时前
从Web到AI:多模态Agent图像识别Skills开发实战——JavaScript+Python全栈图像处理方案
java·javascript·图像处理·人工智能·python·rag
hhy_smile2 小时前
Basic knowledge of Python
python
游戏开发爱好者82 小时前
在 Linux 环境通过命令行上传 IPA 到 App Store,iOS自动化构建与发布
android·linux·ios·小程序·uni-app·自动化·iphone
chao_7892 小时前
跳跃游戏系列【贪心算法】
python·算法·游戏·贪心算法·贪心
飞Link2 小时前
K 折交叉验证(K-Fold Cross Validation)全解析:原理、代码实践、应用场景与常见坑点
人工智能·python·机器学习
Gofarlic_OMS2 小时前
Fluent许可证使用合规性报告自动化生成系统
java·大数据·运维·人工智能·算法·matlab·自动化
衫水2 小时前
如何在离线情况下部署项目(前端VUE + 后端Python)
前端·vue.js·python
【赫兹威客】浩哥2 小时前
【赫兹威客】框架模板-后端命令行部署教程
python·django
Java后端的Ai之路2 小时前
【Python小知识】-self是什么?
linux·python··self