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()# 创建空的目标DataFrameresult_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 = Truebreak # 发现非法字符即跳出字符循环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': ['alice@example.com', 'bob@测试.com', 'charlie@valid.com'],'age': [25, 30, 35]}df = pd.DataFrame(data)# 执行过滤filtered_df = filter_invalid_rows(df)# 导出到Excelfiltered_df.to_excel("filtered_results.xlsx", index=False)print("过滤完成,结果已保存到filtered_results.xlsx")
代码说明:
allowed_chars
集合包含了所有允许的字符,使用set
类型便于快速查找- 使用
select_dtypes
选择所有object类型的列(通常对应字符串列) - 通过逐行逐列检查每个字符的方式验证数据
- 使用
pd.concat
动态添加包含非法字符的行到结果DataFrame - 最终结果导出为Excel文件
注意:
- 该代码会保留原始数据的所有列和数据类型
- 空值(NaN)会被自动跳过不做检查
- 包含中文、特殊符号(如
测试
中的汉字)等不在允许字符列表中的内容会被过滤出来 - 导出的Excel文件名可以通过修改
to_excel
参数调整
示例数据中:
- 第二行"Bòb"包含字符
ò
- 第二行"bob@测试.com"包含汉字
这些非法字符所在的行都会被过滤到结果文件中。