Python Pandas查找Dataframe中的非ASCII字符并导出为Excel文件

import pandas as pd

# 假设df是原始DataFrame
# allowed_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~"

def filter_invalid_rows(df):
    # 定义允许的字符集合
    allowed_chars = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~")
    
    # 选择所有字符串类型的列
    str_columns = df.select_dtypes(include=['object']).columns.tolist()
    
    # 创建空的目标DataFrame
    result_df = pd.DataFrame(columns=df.columns)
    
    # 遍历每一行
    for idx, row in df.iterrows():
        invalid_found = False
        
        # 检查每个字符串列
        for col in str_columns:
            cell_value = row[col]
            
            # 跳过空值
            if pd.isna(cell_value):
                continue
                
            # 将单元格值转换为字符串
            str_value = str(cell_value)
            
            # 检查每个字符
            for char in str_value:
                if char not in allowed_chars:
                    invalid_found = True
                    break  # 发现非法字符即跳出字符循环
            if invalid_found:
                break  # 发现非法字符即跳出列循环
                
        # 如果发现非法字符则保留该行
        if invalid_found:
            result_df = pd.concat([result_df, row.to_frame().T], ignore_index=True)
    
    return result_df

# 使用示例
if __name__ == "__main__":
    # 创建示例数据
    data = {
        'id': [1, 2, 3],
        'name': ['Alice', 'Bòb', 'Charlie'],
        'email': ['[email protected]', 'bob@测试.com', '[email protected]'],
        'age': [25, 30, 35]
    }
    df = pd.DataFrame(data)
    
    # 执行过滤
    filtered_df = filter_invalid_rows(df)
    
    # 导出到Excel
    filtered_df.to_excel("filtered_results.xlsx", index=False)
    print("过滤完成,结果已保存到filtered_results.xlsx")

代码说明:

  1. allowed_chars集合包含了所有允许的字符,使用set类型便于快速查找
  2. 使用select_dtypes选择所有object类型的列(通常对应字符串列)
  3. 通过逐行逐列检查每个字符的方式验证数据
  4. 使用pd.concat动态添加包含非法字符的行到结果DataFrame
  5. 最终结果导出为Excel文件

注意:

  • 该代码会保留原始数据的所有列和数据类型
  • 空值(NaN)会被自动跳过不做检查
  • 包含中文、特殊符号(如测试中的汉字)等不在允许字符列表中的内容会被过滤出来
  • 导出的Excel文件名可以通过修改to_excel参数调整

示例数据中:

  • 第二行"Bòb"包含字符ò
  • 第二行"bob@测试.com"包含汉字
    这些非法字符所在的行都会被过滤到结果文件中。

你可能感兴趣的:(python,pandas,数据分析,开发语言)