Pandas特定列空值校验(含条件例外)与科学计数法检测问题
CSV数据校验问题及修复
需求说明
我有一个包含100列的CSV文件,需完成两项数据校验任务:
任务1:指定列空值校验
需检查以下列的空值:
- bank and trade code
- book value
- business unit
- COE value
- corporate product id
- counterparty legal entity
- currency
- cusip
- face amount
- legal entity
- origination date
- QRM book value
- QRM face value
校验规则:若列存在空值需打印标记,但origination date列有例外:当对应source system列值为"post-close adjustment"或"GL-SDI gap"时,其空值无需标记。现有代码未按预期运行。
任务2:指定列科学计数法值校验
需检查以下列是否存在科学计数法格式的值:
- book value
- face amount
- QRM book value
- QRM face amount
校验规则:若存在需打印标记,但现有代码误报全部4列。
我尝试的代码
空值校验代码
import pandas as pd # Read the CSV file df = pd.read_csv('c:/user/file.csv') # Columns to check for blank values columns_to_check = ['bank', 'trade code', 'book value', 'business unit', 'COE value', 'corporate product id', 'counterparty legal entity', 'currency', 'qsip', 'face amount', 'legal entity', 'origination date', 'qrm book value', 'qrm face value', 'source system'] # Function to check for blank values and print column names with blanks def check_for_blank_values(df): for col in columns_to_check: blank_values = df[df[col].isna()] if not blank_values.empty and not (col == 'origination date' and ~blank_values['source system'].isin(['post-close adjustment', 'GL-SDI gap']).all()): print(f"Column '{col}' has blank values.") # Check for blank values check_for_blank_values(df)
科学计数法检测代码
import pandas as pd # Read the CSV file df = pd.read_csv('c:/user/file.csv') # Function to check if any value in the column is in scientific notation def check_scientific_values(df, column_names): for column_name in column_names: df[column_name] = pd.to_numeric(df[column_name], errors='coerce') if df[column_name].dtype == 'float64': print(f"The values in column '{column_name}' are in scientific notation.") # Columns to check columns_to_check = ['book value', 'face amount', 'QRM face amount', 'QRM book value'] check_scientific_values(df, columns_to_check)
修复方案
任务1:空值校验代码修复
原代码问题点:
- 列名匹配错误:将
bank and trade code拆分为两列,cusip误写为qsip,QRM开头的列名写成小写,还错误加入了不需要检查空值的source system列。 - 例外逻辑错误:原判断逻辑仅当所有空值行的
source system都不在例外列表时才标记,实际需求是只要存在一行空值行的source system不在例外列表,就需要标记该列。
修复后代码:
import pandas as pd df = pd.read_csv('c:/user/file.csv') # 修正列名,严格匹配需求中的目标列 columns_to_check = [ 'bank and trade code', 'book value', 'business unit', 'COE value', 'corporate product id', 'counterparty legal entity', 'currency', 'cusip', 'face amount', 'legal entity', 'origination date', 'QRM book value', 'QRM face value' ] def check_for_blank_values(df): for col in columns_to_check: # 获取当前列的所有空值行 blank_rows = df[df[col].isna()] if blank_rows.empty: continue # 处理origination date的特殊例外规则 if col == 'origination date': # 筛选出不符合例外条件的空值行(source system不在指定列表) invalid_blanks = blank_rows[~blank_rows['source system'].isin(['post-close adjustment', 'GL-SDI gap'])] if not invalid_blanks.empty: print(f"Column '{col}'存在不符合例外条件的空值。") else: print(f"Column '{col}'存在空值。") check_for_blank_values(df)
任务2:科学计数法检测代码修复
原代码问题点:
将列数据类型为float64等同于存在科学计数法值,这是错误的——float是数值存储类型,科学计数法是数值的字符串表示格式,必须检查原始字符串是否包含科学计数法标识(e或E)。
修复后代码:
import pandas as pd df = pd.read_csv('c:/user/file.csv') columns_to_check = ['book value', 'face amount', 'QRM book value', 'QRM face amount'] def check_scientific_values(df, column_names): for col in column_names: # 过滤空值并转为字符串,保留原始格式信息 non_null_vals = df[col].dropna().astype(str) # 检查是否存在包含e/E的科学计数法格式值 has_sci_notation = non_null_vals.str.contains(r'[eE]', regex=True).any() if has_sci_notation: print(f"Column '{col}'存在科学计数法格式的值。") check_scientific_values(df, columns_to_check)
内容的提问来源于stack exchange,提问作者Peter Parker
相关产品推荐
相关产品推荐

