如何基于列值移除行内重复列(含例外规则适配大型JSON)
高效移除大型JSON中重复值列(排除二进制列)
针对你需要处理大型扁平化JSON、移除非二进制列中全行值重复的重名列的需求,咱们用向量化操作替代低效循环,保证处理效率。下面是具体的实现方案:
核心思路
- 先区分二进制列(仅含2种值,如布尔值、0/1)和非二进制列,二进制列即使值重复也保留;
- 对非二进制列,通过列哈希快速识别全行值完全重复的列组(哈希值相同则列值完全一致);
- 每组重复列只保留一个,最后合并二进制列得到结果。
Python 实现代码
import pandas as pd import hashlib def hash_column(col): # 生成列的唯一哈希值,用于快速判断列值是否完全重复 # 先转字符串统一类型,再转字节流计算MD5哈希 return hashlib.md5(col.astype(str).values.tobytes()).hexdigest() # 1. 读取大型扁平化JSON文件 # 如果是每行一个JSON对象,加上lines=True;否则去掉 df = pd.read_json("your_large_data.json", lines=True) # 2. 识别二进制列(唯一值数量≤2的列) binary_cols = [] non_binary_cols = [] for col in df.columns: unique_count = df[col].nunique() if unique_count <= 2: binary_cols.append(col) else: non_binary_cols.append(col) # 3. 计算非二进制列的哈希值,分组重复列 col_hash_map = {col: hash_column(df[col]) for col in non_binary_cols} hash_groups = {} for col, h in col_hash_map.items(): hash_groups.setdefault(h, []).append(col) # 4. 每组重复列仅保留第一个 keep_non_binary = [group[0] for group in hash_groups.values()] # 5. 合并保留列,生成清洗后的数据 final_columns = keep_non_binary + binary_cols df_cleaned = df[final_columns] # 6. 保存清洗后的JSON(可选,按原格式保存) df_cleaned.to_json("cleaned_data.json", orient="records", lines=True)
关键细节说明
- 高效性:所有列操作都是Pandas向量化执行,哈希计算基于整列字节流,完全避免逐行循环,处理大型数据集速度极快;
- 类型兼容:把列转成字符串后再哈希,能兼容不同数据类型但值相同的列(比如int类型的35和字符串类型的"35"),如果不需要这个兼容,可以去掉
astype(str); - 二进制列判断:通过
nunique() <=2识别,覆盖布尔列、0/1列等场景,符合你的排除需求; - 测试验证:用你给出的示例数据测试,会自动保留
Name, Age, Job(非二进制去重后)和Happy, Married?(二进制列),完全匹配期望输出。
内容的提问来源于stack exchange,提问作者liamod
相关产品推荐
相关产品推荐

