pandas合并两个df数据(数据互补)

fixed_columns = ['交收类别', '证券市场', '证券编号', '项目编号', '证券名称', '成交价格', '交收日期']
fixed_columns2 = ['交收类别', '证券市场', '证券编号', '证券名称', '交收日期']
fixed_df = pd.DataFrame({i: [np.nan] for i in fixed_columns})
fixed_df2 = pd.DataFrame({i: ['有值'] for i in fixed_columns2})
print(fixed_df)
print('-' * 111)
print(fixed_df2)

merged_df = fixed_df2.combine_first(fixed_df)
# 根据fixed_columns重新排列列的顺序
merged_df = merged_df.reindex(columns=fixed_columns)
print('-' * 100)
print(merged_df)

"""
   交收类别  证券市场  证券编号  项目编号  证券名称  成交价格  交收日期
0   NaN   NaN   NaN   NaN   NaN   NaN   NaN
---------------------------------------------------------------------------------------------------------------
  交收类别 证券市场 证券编号 证券名称 交收日期
0   有值   有值   有值   有值   有值
----------------------------------------------------------------------------------------------------
  交收类别 证券市场 证券编号  项目编号 证券名称  成交价格 交收日期
0   有值   有值   有值   NaN   有值   NaN   有值
"""
<think>好的,我现在需要帮助用户了解数据清洗中去重的最佳实践。用户之前已经问过相关问题,现在想深入学习或实现去重方法。首先,我得回顾一下已有的引用内容,看看哪些信息可以利用。 引用[2]提到数据判定与去重,包括去重判定、数据格式判定等,可能涉及到具体的技术方法。引用[3]则介绍了机器学习中使用哈希处理标记重复点的方法,并给出了Python代码示例。这些是重要的资源,应该整合到回答中。 用户的问题是关于数据去重的最佳实践,需要分步骤说明,结构清晰。首先可能需要确定重复数据的定义,然后讨论识别方法,接着是处理策略,最后是验证和优化。同时,用户可能需要具体的例子或代码片段,比如Python的pandas库或哈希方法的应用。 另外,用户可能关心不同场景下的去重方法,比如基于整个记录还是特定字段,如何处理大数据集等。需要提到哈希处理在大数据中的效率,以及近似去重的方法如SimHash。同时,数据备份和验证步骤也很重要,确保去重过程不会丢失重要信息。 还要注意引用文献的正确应用,比如引用[2]和[3]中的方法。需要检查是否有其他引用内容相关,但根据提供的引用,主要参考这两个即可。最后,生成相关问题时要围绕去重的技术、工具、挑战和评估等方面,帮助用户进一步学习。</think>数据去重是数据清洗中的核心环节,以下是分步骤的最佳实践指南: ### 一、明确定义重复数据 1. **全字段匹配**:整条记录所有字段完全相同(如:$hash(row)=hash(row')$) 2. **关键字段匹配**:指定核心字段作为判定依据(如:身份证号+手机号) 3. **模糊匹配**:允许部分字段存在差异(如:地址「北京市朝阳区」vs「北京朝阳区」) ### 二、识别重复数据的技术实现 1. **精确去重方法**: ```python # pandas基于列去重 df.drop_duplicates(subset=['id','phone'], keep='first') # 哈希标记法(适合大数据) import hashlib df['hash'] = df.apply(lambda x: hashlib.sha256(pd.util.hash_pandas_object(x).encode()).hexdigest(), axis=1) ``` 2. **近似去重方法**: - 使用SimHash算法处理文本相似度 - 编辑距离(Levenshtein Distance)匹配字符串 ```python # 示例:计算字符串相似度 from Levenshtein import ratio similarity = ratio("北京市朝阳区", "北京朝阳区") # 返回0.89 ``` ### 三、处理策略选择 | 策略类型 | 适用场景 | 实现示例 | |---------|---------|---------| | 首条保留 | 时间序列数据 | `keep='first'` | | 末条保留 | 最新数据优先 | `keep='last'` | | 合并处理 | 部分字段互补 | `groupby().agg()` | | 标记不处理 | 需人工复核 | `df['is_duplicate'] = df.duplicated()` | ### 四、验证与优化 1. **质量评估指标**: $$ 重复率 = \frac{重复记录数}{总记录数} \times 100\% $$ 2. **抽样验证**:对去重结果进行分层抽样检查 3. **性能优化**: - 使用Spark进行分布式去重 ```scala val df = spark.read.parquet("data.parquet") df.dropDuplicates(Array("user_id","timestamp")) ``` - 对字段建立索引加速查询 ### 五、特殊场景处理 1. **流数据去重**:使用Bloom Filter实现实时去重[^2] 2. **图像数据去重**:计算PHash指纹比对 3. **跨表去重**:通过外键关联多表数据 > **重要提示**:执行去重前务必进行数据备份,建议采用`CREATE TABLE backup AS SELECT * FROM source`方式保留原始数据[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值