761 words
4 minutes
Data Standardization
2025-01-16

数据贯标思路.

---
title: Data Standardization
published: 2025-01-16
// ...
---
from collections import defaultdict
import pandas as pd
import re
import os

# 检查并删除原有的匹配结果文件
if os.path.exists('matched_results.xlsx'):
    os.remove('matched_results.xlsx')
    print("已删除原有的 'matched_results.xlsx' 文件")

# 读取两份Excel文件
df1 = pd.read_excel('C:/Users/mason/Desktop/新建文件夹/filtered_file.xlsx')
df2 = pd.read_excel('C:/Users/mason/Desktop/新建文件夹/test1.xlsx')

# 检查数据格式
print("第一份数据前5行:")
print(df1.head())

print("\n第二份数据前5行:")
print(df2.head())

# 定义一个函数,提取字符串中的中文部分
def extract_chinese(text):
    # 使用正则表达式匹配中文字符
    chinese_pattern = re.compile(r'[\u4e00-\u9fff]+')
    chinese_matches = chinese_pattern.findall(str(text))
    return ''.join(chinese_matches)  # 将所有匹配的中文拼接成一个字符串

# 调试:打印提取的中文部分
print("\n第一份数据中文提取示例:")
for index1, content in enumerate(df1.iloc[:, 0]):
    chinese_part = extract_chinese(content)
    print(f"原始: {content} -> 提取: {chinese_part}")

print("\n第二份数据中文提取示例:")
for index2, content in enumerate(df2.iloc[:, 0]):
    chinese_part = extract_chinese(content)
    print(f"原始: {content} -> 提取: {chinese_part}")

# 预处理第二份Excel的第一列数据,提取中文部分并构建字典
# 键为中文部分,值为对应的整行数据(pandas.Series)和行号
chinese_to_row = {}
for index2, row2 in df2.iterrows():
    chinese_part = extract_chinese(row2.iloc[0])  # 提取中文部分
    if chinese_part:  # 如果有中文部分
        chinese_to_row[chinese_part] = (row2, index2 + 1)  # 存储整行数据和行号(从1开始)

# 创建一个空的DataFrame来存储匹配结果
# 列名为第一份数据的列名 + 第二份数据的列名(添加后缀 '_matched') + 匹配的行号
result_columns = list(df1.columns) + [col + '_matched' for col in df2.columns] + ['Matched_Row']
result = pd.DataFrame(columns=result_columns)

# 记录哪些行已经匹配成功,避免重复匹配
matched_indices = set()

# 第一步:完全匹配
for index1, row1 in df1.iterrows():
    chinese_name1 = extract_chinese(row1.iloc[0])  # 提取第一份数据的中文部分

    # 检查是否有完全匹配
    if chinese_name1 in chinese_to_row:
        matched_row2, matched_row_number = chinese_to_row[chinese_name1]
        # 将匹配结果添加到 result DataFrame
        new_row = row1.tolist() + matched_row2.tolist() + [matched_row_number]
        result.loc[len(result)] = new_row
        matched_indices.add(index1)  # 记录已匹配的行
        print(f"完全匹配成功: {chinese_name1} -> 第二份数据行号: {matched_row_number}")

# 第二步:对未匹配的行进行连续4个中文字符的模糊匹配
for index1, row1 in df1.iterrows():
    if index1 in matched_indices:  # 跳过已匹配的行
        continue

    chinese_name1 = extract_chinese(row1.iloc[0])  # 提取第一份数据的中文部分

    matched_row2 = None
    matched_row_number = None

    # 提取 chinese_name1 的所有连续4字符子串
    chinese_substrings = {chinese_name1[i:i+4] for i in range(len(chinese_name1) - 3)}

    # 遍历字典,检查是否有连续4个中文匹配
    for key in chinese_to_row:
        # 提取 key 的所有连续4字符子串
        key_substrings = {key[i:i+4] for i in range(len(key) - 3)}

        # 检查是否有共同的子串
        if chinese_substrings & key_substrings:  # 集合交集不为空
            matched_row2, matched_row_number = chinese_to_row[key]
            break

    # 如果找到匹配,将结果添加到 result DataFrame
    if matched_row2 is not None:
        new_row = row1.tolist() + matched_row2.tolist() + [matched_row_number]
        result.loc[len(result)] = new_row
        print(f"模糊匹配成功: {chinese_name1} -> 第二份数据行号: {matched_row_number}")
    else:
        print(f"未找到匹配: {chinese_name1}")

    # 打印进度(可选)
    if index1 % 100 == 0:
        print(f"Processed {index1 + 1} rows...")

# 将结果保存到新的Excel文件中
if not result.empty:
    result.to_excel('matched_results.xlsx', index=False)
    print("Matching completed! Results saved to 'matched_results.xlsx'.")
else:
    print("No matches found.")
Data Standardization
https://masonry440921.github.io/blog/posts/datastandardization/
Author
mason
Published at
2025-01-16